将类名作为标识符分配给变量时,会出现令人困惑的行为

2024-10-02 10:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我是在玩Python,因为我对它比较陌生。下面是一个片段

class Person:

    version = "1.0"

    def __init__(self, name="john doe",age=25):
        self.name = name
        self.first_name = name.split()[0]
        self.second_name = name.split()[1]
        self.age = age

    def printi(self):
        print(self.name)




new_person = Person()
new_person.printi()

refPerson = Person
print(refPerson.version)
another_one = refPerson()
#another_one.version = "2.0"
print(another_one.version)
another_one.printi()
print(Person.version)
Person.version = "2.0"
print(another_one.version)
print(refPerson.version)

如果您注意到,类名Person直接分配给变量refPerson。我的印象是,这篇作业将创建一个名为refPerson的新类。但是当我修改Person类属性时,我可以看到值的变化反映在新类中。我错过了什么?我只需要一张清晰的照片。 提前谢谢


Tags: nameselfnewageversiondefanotherone
1条回答
网友
1楼 · 发布于 2024-10-02 10:19:05

类是Python中的第一类对象;你可以到处传递对它们的引用

Person是对class语句定义的类的引用Person()(像函数一样调用class对象)返回该类的实例

属性查找规则可能会变得复杂,但对于本例,以下简化就足够了。由于既没有定义new_person.version也没有定义another_one.version,因此尝试查找其中一个将导致类属性查找。也就是说,new_person.version == type(new_person).version

如果创建具有相同名称的实例属性,它将对类属性进行阴影处理:

>>> new_person.version = 3
>>> new_person.version
3
>>> type(new_person).version
"1.0"
>>> another_one.version
"1.0"

在这一阶段,您可能已经准备好了更多的细节,Person()分解为以下调用:

  1. Person()等价于Person.__call__(Person),其中__call__是类type的实例方法,其中Person是实例(也就是说,type(Person)返回type。)

  2. Person.__call__调用Person.__new__,返回Person的新实例;叫它p

  3. Person.__call__然后用p作为参数调用Person.__init__
  4. 最后,Person.__call__返回p

相关问题 更多 >

    热门问题