Python 类属性|实例属性|属性方法
1.属性
class FileCopy:
m_name = "" #类属性
def __init__(self):
self.srcDir = src #实例属性
self.dstDir = dst
if __name__=='__main__':
print(FileCopy.m_name) #类属性
s = FileCopy()
print(s.m_name) #类属性
- 实例属性:
在__init__(self,…)中初始化
内部调用时都需要加上self.
外部调用时用instancename.propertyname
- 类属性:
在__init__()外初始化
在内部用classname.类属性名调用
外部既可以用classname.类属性名又可以用instancename.类属性名来调用
- 私有属性:
1):单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改
2):双下划线__开头:外部不可通过instancename.propertyname来访问或者更改
实际将其转化为了_classname__propertyname
2.get, set, del 与 @property
python中可以自己定义一个属性的get, set, del方法,但是通常不会这么做
可以用property,一个property定义了getter, setter, deleter方法,并且可以做多余的操作,典型的用法如下:
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
或者如下:
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
@property,优点:可以在方法里做类型验证,值验证,可以用来防止父类属性修改
缺点:和属性相关的方法,只能在子类里面共享,与之无关的类无法复用同一份代码
@property方法应该遵循最小惊讶原则,而不产生奇怪的副作用。 代码要少,复杂逻辑应该放在普通函数里。
3.用描述符来做复用性高的属性方法
描述符类,提供了__get__
和__set__
等方法来定义属性。
WeakKeyDictionary类,像C++的weakptr一样,可以保证引用的一致性。
4.__repr__
用法
__repr__
是内建函数repr()的实现部分,可以让类实例当作函数对象来进行输出一些类的信息。
>> class D(object):
... def __str__(self):
... return "a __str__"
... def __repr__(self):
... return "a __repr__"
...
>>> dr = D()
>>> print dr
a __str__
>>> dr
a __repr__
>>> "%s" % dr
'a __str__'
>>> "%r" % dr
'a __repr__'
参考: