美文网首页Python基础python_pycham
Python:类属性与实例属性

Python:类属性与实例属性

作者: 子休_ | 来源:发表于2018-01-30 16:44 被阅读153次

在了解类的属性之前,应该先对__dict__属性有所了解。官方文档是这样说的

A dictionary or other mapping object used to store an object’s (writable) attributes.

中文意思是:__dict__是一个储存类的可写属性的的字典或者其他映射对象。

实际上大部分情况下都是一个字典。所以下文默认以字典来使用__dict__

类属性&实例属性


  • 类属性在类被申明时便确定好了,类似于这样
class Test:
    name = "Hell"

name就是类属性,我们可以直接通过类的__dict__里拿到这个值。也可以直接使用Test.name来调用。

Test.__dict__["name"]
  • 实例属性在__init__()运行之后才被确定
class Test:
    name = "Hell"
    def __init__(self, user):
        self.user = user

Fuck = Test("fuck")

这里面的self.user就是实例属性,可以通过Fuck.user来调用,也能用Fuck.__dict__["user"]来调用。

  • 类属性和实例属性的冲突
class Test:
    name = "Hell"
    def __init__(self, user):
        self.name = user

Fuck = Test("fuck")

这段代码运行后,当我们使用Fuck.name调用属性的时候,会发现值是fuck
此时,实例属性盖住了类属性。使我们不能直接使用self.name调用类属性。

  1. 可以使用Fuck.__class__.__dict__["name"]来访问类属性。
  2. 或者删掉重名的实例属性del Fuck.name
    之后,再调用Fuck.name这时我们就能调用到类属性了。
    然而,此时会发现Fuck.__dict__["name"]会报错,提醒你没有这个key。
    这很好理解,Fuck.__dict__这个字典存储的是Fuck这个实例的属性,而不是Test这个类的。

事实上,getattr(Fuck, "name")等价于Fuck.name,它们查找顺序是这样的

  1. 实例属性
    如果没查到,继续向下查
  2. 类属性
    如果还没查到,报错

setattrdelattrhasattr都是类似的。优先查找/修改实例属性,然后是类属性。


Fuck.__class__.__dict__["name"]等价于Test.__dict__["name"]等价于Test.name
原因如上

相关文章

  • Python实例变量和类变量

    Python实例变量和类变量 类变量(类属性): 类变量属于类所有,所有实例共享一个变量 实例变量(实例属性) 实...

  • 实例属性和类属性

    实例属性和类属性: 由于Python是动态语言,根据类创建的实例可以任意绑定属性。 (1)给实例绑定属性的方法是通...

  • TypeScript:属性装饰器

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

  • 面向对象编程

    主要包括: 基本概念 属性私有化(类的封装) 实例属性与类属性 静态方法、类方法、与实例方法 继承与多态 获取对象...

  • Python面向对象编程

    类相关知识 对象相关知识 类属性增删改查 实例属性增删改查 对象与实例属性 静态属性 类方法 静态方法 组合 继承...

  • 16、面向对象编程(二)

    16.1 python中创建类属性 类是模板,而实例则是根据类创建的对象。 绑定在一个实例上的属性不会影响其他实例...

  • 类6.类的实例属性

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

  • Python学习之路

    一、Python 中类的属性分为实例属性和类属性,属性就是附在对象后可被引用的函数或者数据。通常我们将类中的函数又...

  • python-实例属性与类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性。 给实例绑定属性的方法是通过实例变量,或者通过sel...

  • 27. OOP-实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量,或者通过self...

网友评论

本文标题:Python:类属性与实例属性

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