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

时间:2017-07-29 12:16:25

标签: python static-methods instance-variables class-method

我创建了没有实例变量的类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 个答案:

答案 0 :(得分:2)

没有实例变量,只是Python对象中的名称查找首先查看实例,然后,如果没有找到匹配,则进入该类。

  

类实例

     

通过调用类对象来创建类实例(参见上文)。类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置。当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性。 [...]如果没有找到类属性,并且对象的类具有__getattr__()方法,则调用该方法以满足查找。

Python 2Python 3

答案 1 :(得分:1)

当您尝试使用类访问变量时,它仅查看

select d::date
from (
    select
        d at time zone 'America/Los_Angeles' as la,
        lead(d at time zone 'America/Los_Angeles') over (order by d) as la_,
        d 
    from generate_series (
        '2017-01-01'::timestamp,
        '2017-12-31', '1 day'
    ) gs (d)
) s
where la::time <> la_::time;
     d      
------------
 2017-03-12
 2017-11-05

但是当你尝试用实例访问变量时,它首先看起来

cls.__dict__

如果找到然后返回或者如果找不到那么它也会查找

self.__dict__ 

这里cls是班级

cls.__dict__

<强>输出

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__

详细信息class special attribute