我创建了没有实例变量的类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
应该抛出一个错误。
答案 0 :(得分:2)
没有实例变量,只是Python对象中的名称查找首先查看实例,然后,如果没有找到匹配,则进入该类。
类实例
通过调用类对象来创建类实例(参见上文)。类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置。当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性。 [...]如果没有找到类属性,并且对象的类具有
__getattr__()
方法,则调用该方法以满足查找。
答案 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__