代码之家  ›  专栏  ›  技术社区  ›  Hash Doe

为什么类变量可以通过类实例访问?[副本]

  •  2
  • Hash Doe  · 技术社区  · 8 年前

    我已经创建了类 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
    

    . 我想是吧 print myCircle.diameter

    2 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    5 年前

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

    类实例

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

    Python 2 , Python 3 )

        2
  •  1
  •   Kallz    8 年前

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

    cls.__dict__
    

    self.__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__
    

    输出 :

    {'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