开发中常遇到的Python陷阱和注意点(四)

本文介绍了Python中类属性和实例属性的概念,强调了当实例定义了与类同名属性时,类属性会被隐藏。通过示例展示了类属性的访问和修改,并探讨了在继承场景下类属性的隐藏现象。同时,提到了如何通过类的__dict__属性查看类属性。
摘要由CSDN通过智能技术生成

转自:http://www.weidianyuedu.com/

类属性隐藏
在Python中,有类属性和实例属性。类属性是属于类本身的,被所有的类实例共享。

类属性可以通过类名访问和修改,也可以通过类实例进行访问和修改。但是,当实例定义了跟类同名的属性后,类属性就被隐藏了。

看下面这个例子:

class Student(object):
books = [“Python”, “JavaScript”, “CSS”]
def init(self, name, age):
self.name = name
self.age = age
pass

wilber = Student(“Wilber”, 27)
print “%s is %d years old” %(wilber.name, wilber.age)
print Student.books
print wilber.books
wilber.books = [“HTML”, “AngularJS”]
print Student.books
print wilber.books
del wilber.books
print Student.books
print wilber.books
代码的结果如下,起初wilber实例可以直接访问类的books属性,但是当实例wilber定义了名称为books的实例属性之后,wilber实例的books属性就“隐藏”了类的books属性;当删除了wilber实例的books属性之后,wilber.books就又对应类的books属性了。

Wilber is 27 years old
[‘Python’, ‘JavaScript’, ‘CSS’]
[‘Python’, ‘JavaScript’, ‘CSS’]
[‘Python’, ‘JavaScript’, ‘CSS’]
[‘HTML’, ‘AngularJS’]
[‘Python’, ‘JavaScript’, ‘CSS’]
[‘Python’, ‘JavaScript’, ‘CSS’]
当在Python值使用继承的时候,也要注意类属性的隐藏。对于一个类,可以通过类的__dict__属性来查看所有的类属性。

当通过类名来访问一个类属性的时候,会首先查找类的__dict__属性,如果没有找到类属性,就会继续查找父类。但是,如果子类定义了跟父类同名的类属性后,子类的类属性就会隐藏父类的类属性。

看一个例子:

class A(object):
count = 1

class B(A):
pass

class C(A):
pass

print A.count, B.count, C.count
B.count = 2
print A.count, B.count, C.count
A.count = 3
print A.count, B.count, C.count
print B.dict
print C.dict
结果如下,当类B定义了count这个类属性之后,就会隐藏父类的count属性:

1 1 1
1 2 1
3 2 3
{‘count’: 2, ‘module’: ‘main’, ‘doc’: None}
{‘module’: ‘main’, ‘doc’: None}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值