Python 类属性和实例属性

Python 类属性和实例属性

属性就是属于一个对象的数据或者函数元素,可以通过我们熟悉的据点属性标识法来访问。

类属性

类属性包含类的数据属性和方法属性(函数),类属性只与其定义的类相关。
访问类的字典属性__dict__可以获得类属性。

class Test(object):
    v = 0.1

    def test(self):
        pass

>Test.__dict__
>{'__module__': '__main__', '__dict__': '__dict__' of 'Test' objects>, 'v': 0.1, 'test': 0x2ee3cf8>, '__weakref__': '__weakref__' of 'Test' objects>, '__doc__': None}

除了定义的v, test, __init__ 属性外,还有一些特殊的类属性。

attribute desc
__name__ 类的名字字符串
__doc__ 类的文档字符串
__bases__ 类的基类元组
__dict__ 类的属性
__module__ 类定义所在的模块
__class__ 类对象对应的类

实例属性

类实例化后具有的属性,通过__dict__方法可以获取实例属性。

class Test(object):
    v = 0.1
    def __init__(self):
        self.info = 'test'


t = Test()
>t.__dict__
>{'info': 'test'}

严格来说,实例属性应只包含数据属性。

但其实我们可以给实例增加方法属性。

class Test(object):
    pass

t = Test()
def fun():
    pass
t.f = fun
>t.__dict__
>{'f': }

类属性和实例属性区别

下面举几个例子说明类属性和方法属性。

class Test(object):
    v = 1

t = Test()
print t.v       # 类属性,1
print Test.v    # 类属性,1
t.v = 2         # 修改实例属性,此处类属性不变(当且仅当实例属性为不可变对象)
print t.v       # 实例属性,2
print Test.v    # 类属性,1
del t.v         # 删除实例属性
print t.v       # 访问类属性,1
Test.v = 2      # 修改类属性
print Test.v    # 访问类属性,2
print t.v       # 访问类属性,2

注意:

1.内建函数dir可以用来查看类属性和实例属性,但得到的内容比预期要多。
2.虽然类属性不是实例属性,但类的实例可以访问类的属性。
3.不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

你可能感兴趣的:(Python)