为什么类变量可以通过类实例访问?

3

我创建了一个没有实例变量的Circle类。我添加了一个类方法from_diameter,用于生成给定直径的圆。

class Circle:

    @classmethod
    def from_diameter(cls, diameter):
        cls.diameter = diameter
        return cls

diameter是一个类(静态)变量。然而,看起来它也存在于实例变量和类变量中。

myCircle = Circle.from_diameter(10)
print Circle.diameter
print myCircle.diameter

输出:

10
10

为什么它能工作?没有实例变量diameter。我猜print myCircle.diameter应该会抛出错误。

2
通过类实例查找类变量,这正是在实例上调用类方法时找到它们的方法。换句话说,如果不是这样,类将完全无用。 - jasonharper
2个回答

2
没有实例变量,只是Python对象中的名称查找首先查找实例,然后如果找不到匹配项,则查找类。
类实例 一个类实例是通过调用类对象(见上文)创建的。类实例有一个作为字典实现的命名空间,这是属性引用搜索的第一个位置。当那里找不到属性时,如果实例的类有一个同名属性,则搜索将继续进行类属性。如果未找到类属性,并且对象的类具有__getattr__()方法,则调用该方法以满足查找。(摘自Python 2Python 3

1
当您尝试使用类访问变量时,它仅查找其中的内容。
cls.__dict__

但是当您尝试使用实例访问变量时,它首先查找
self.__dict__ 

如果找到,则返回;如果找不到,则还会在...中查找。
cls.__dict__

这里的 cls 是类(class)

class Test:
    temp_1=10
    temp_2=20

    def __init__(self):
        self.test_1=10
        self.test_2=20

    @classmethod
    def c_test(cls):
        pass

    def t_method(self):
        pass


print Test.__dict__
print Test().__dict__

输出:

{'c_test': <classmethod object at 0x7fede8f35a60>, '__module__': '__main__', 't_method': <function t_method at 0x7fede8f336e0>, 'temp_1': 10, '__doc__': None, '__init__': <function __init__ at 0x7fede8f335f0>, 'temp_2': 20}

{'test_2': 20, 'test_1': 10}

细节请查看 class special attribute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接