美文网首页
27-python中类属性和实例属性名字冲突怎么办

27-python中类属性和实例属性名字冲突怎么办

作者: mingminy | 来源:发表于2017-12-22 09:47 被阅读0次

修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?

class Person(object):

address = 'Earth'

def __init__(self, name):

self.name = name

p1 = Person('Bob')

p2 = Person('Alice')

print 'Person.address = ' + Person.address

p1.address = 'China'

print 'p1.address = ' + p1.address

print 'Person.address = ' + Person.address

print 'p2.address = ' + p2.address

结果如下:

Person.address = Earth

p1.address = China

Person.address = Earth

p2.address = Earth

我们发现,在设置了p1.address = 'China'后,p1访问 address 确实变成了 'China',但是,Person.address和p2.address仍然是'Earch',怎么回事?

原因是p1.address = 'China'并没有改变 Person 的 address,而是给p1这个实例绑定了实例属性address,对p1来说,它有一个实例属性address(值是'China'),而它所属的类Person也有一个类属性address,所以:

访问p1.address,优先查找实例属性,返回'China'。

访问p2.address,p2没有实例属性address,但是有类属性address,因此返回'Earth'。

可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

当我们把 p1 的 address 实例属性删除后,访问 p1.address 就又返回类属性的值 'Earth'了:

del p1.addressprint p1.address# => Earth

可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

相关文章

  • 27-python中类属性和实例属性名字冲突怎么办

    修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢? class...

  • Swift 中的协议

    实例属性,实例方法,类方法,运算符,下标 语法 属性 指定属性的 名字 和 类型,以及 getterable or...

  • TypeScript:属性装饰器

    回顾类的属性 回顾面向对象,类中的属性分为实例属性和静态属性,实例属性属于实例化后的对象,静态属性属于类本身 在类...

  • 类6.类的实例属性

    定义 类的实例属性,就是类的实例所拥有的属性,是实例的特色之处。和类的属性的区别:类的实例属性属于这个实例所拥有,...

  • python中实例属性和类属性

    一、 什么是实例和类属性 实例属性:声明在方法中,通过self声明的属性,是实例对象所特有的属性,而实例对象是类创...

  • Python魔法方法-__dict__

    __dict__ 类或对象中的所有属性类的实例属性属于对象;类中的类属性和方法等属于类,即:

  • python 理解类变量与实例变量

    实例的属性存储在实例的dict中。 类属性和方法存储在类的dict中。 查找属性的顺序:特性->实例的dict->...

  • 09.属性方法分类

    1.在JavaScript中属性和方法分类两类 1.1实例属性/实例方法在企业开发中通过实例对象访问的属性, 我们...

  • Python:9.面向对象编程

    访问限制 继承和多态 获取对象信息 实例属性和类属性 千万不要对类属性和实例属性使用相同的名字,因为相同名字的实例...

  • Mr.Li--python-Linux-属性和方法

    类属性和实例属性 : 类属性: 实例属性(对象属性): ·如果需要在类外修改类属性,必须通过类对象去引用然后进行修...

网友评论

      本文标题:27-python中类属性和实例属性名字冲突怎么办

      本文链接:https://www.haomeiwen.com/subject/aektgxtx.html