在Python中看到以下行为时,我有点惊讶。打开未调用的类并读取其静态成员是否有原因?
test_inheritance.py
import unittest
from tests.family import Parent
class Test(unittest.TestCase):
def testParent(self):
bob = Parent()
if __name__ == "__main__":
unittest.main()
family.py
class Parent(object):
CONSTANT = "Constant belonging to Parent"
print("Parent {0}".format(CONSTANT))
def __init__(self):
print(">>__init_() Parent")
class Child(Parent):
CONSTANT = "Constant belonging to Child"
print("Child {0}".format(CONSTANT))
def __init__(self):
print(">>__init_() Child")
class Friend(object):
CONSTANT = "Constant belonging to Friend"
print("Friend {0}".format(CONSTANT))
def __init__(self):
print(">>__init_() Friend")
输出为:
属于父的父常量
属于子的子常数
属于Friend 的Friend常量
__init_()父
没有实例化Parent
的实例(Parent()
)。然而,描述Parent
类的类对象被实例化(class Parent
)。它将在处理过程中执行所有类对象初始化语句和方法定义。
假设您要问为什么静态类成员在类实例化之前就有值,这是因为类的静态成员本质上独立于类而存在。既然静态成员在定义上并没有绑定到实例,为什么它们需要先存在一个实例才能绑定呢?
我找不到一个很好的参考资料来详细解释这个过程,但我可以收集到:
导入时,类属性引用被添加到
class.__dict__
模块中每个类的对象(例如family.py)。