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__'

参考:

  1. my coding.net
  2. python中的实例方法、类方法、静态方法的区别