早期的python版本中,我們一般用__getattr__()和__setattr__()來處理和屬性相關的問題。屬性的訪問會涉及以上的方法(和__getattribute__()),但是如果用property()來處理這些問題,就可以寫乙個和屬性有關的屬性來處理例項屬性的獲取(getting)、賦值(setting)和刪除(deleting)操作,就不必在使用那些特殊的方法了。
property()內建函式的四個引數,它們是:
property(fget=none, fset=none, fdel=none, doc=none)
實際上,property()是在它所在的類被建立時呼叫的,這些傳進來的(作為引數的)方法是非繫結的,所以這些方法就是函式!
例項一:
class protectandhidex(object):
def __init__(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
def get_x(self):
return ~self.__x
x = property(get_x)
inst = protectandhidex(10)
print "inst.x = ",inst.x
inst.x = 20
inst.x = 10
:
attributeerror: can't set attribute
例項二:
class hidex(object):
def __init__(self,x):
self.x = x
def get_x(self):
return ~self.__x
def set_x(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
x = property(get_x, set_x)
inst2 = hidex(10)
print inst2.x
inst2.x = 20
print inst2.x
10
20例項三:
from math import pi
def get_pi(dummy):
return pi
class pi(object):
pi = property(get_pi,doc = 'constant "pi"')
inst3 = pi()
print inst3.pi
print pi.pi.__doc__
3.14159265359
constant "pi"
例項四:
class hidexx(object):
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
return locals()
inst4 = hidexx(20)
print inst4.x
inst4.x = 40
print inst4.x
:
attributeerror: can't set attribute(至於為什麼,還沒搞明白,新式類繼承自object反而不可以)
修改上述**:
class hidexx:
def __init__(self, x):
self.x = x
@property
def x():
def fget(self):
return ~self.__x
def fset(self,x):
assert isinstance(x,int),\
'"x" must be an integer!'
self.__x = ~x
return locals()
inst4 = hidexx(20)
print inst4.x
inst4.x = 40
print inst4.x
20
40例項五:
class student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise valueerror('score must be an integer!')
if value < 0 or value > 100:
raise valueerror('score must between 0 ~ 100!')
self._score = value
stu = student()
stu.score = 20
print stu.score
20
ref:core python programming
一文帶你搞懂python中的property
通常我們在獲得變數的一些私有屬性時,必須通過方法來獲取私有屬性,並不能直接訪問 修改其數值的時候也是要通過方法去修改,這樣非常的不方便 所以python提供了一種方式,將呼叫方法的的形式轉變為訪問屬性,這樣使用非常方便 class student def init self 這是乙個私有屬性 sel...
Python 類屬性和例項屬性
一 簡述二者區別 對類屬性的修改可被儲存在類中 單例模式就是基於類屬性的這種特性 修改後的屬性能夠被子類繼承 例項屬性的修改只對該例項有效,不會對其他例項和其對應類的子類例項造成影響 二 來看下例子 類屬性 class a object a 1 pass print a.a 檢視a類的屬性a,結果為...
python 例項屬性和類屬性
如何在乙個類中定義一些常量,每個物件都可以方便訪問這些常量而不用重新構造?第乙個問題,在 python 的類裡,你只需要和函式並列地宣告並賦值,就可以實現這一點,例如這段 中的 welcome str。一種很常規的做法,是用全大寫來表示常量,因此我們可以在類中使用 self.welcome str ...