Python 类属性和实例属性

Python 类属性和实例属性

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

类属性

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

class Test(object):
    v = 0.1

    def test(self):
        pass

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

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

attributedesc
__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': <function __main__.fun>}

类属性和实例属性区别

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

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.不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值