Python OOP-无法使用self更改类变量的值

时间:2019-07-08 15:02:08

标签: python python-3.x

我正在遵循this Python Design模式,对于initialize()函数,我有些不了解:

class ObjectFactory:

   """ Manages prototypes.
   Static factory, that encapsulates prototype
   initialization and then allows instatiation
   of the classes from these prototypes.
   """

   __type1Value1 = None
   __type1Value2 = None
   __type2Value1 = None
   __type2Value2 = None

   @staticmethod
   def initialize():
      ObjectFactory.__type1Value1 = Type1(1)
      ObjectFactory.__type1Value2 = Type1(2)
      ObjectFactory.__type2Value1 = Type2(1)
      ObjectFactory.__type2Value2 = Type2(2)

为什么变量的init使用类的名称(即ObjectFactory.__type1Value1)而不使用self(即self.__type1Value1)? 当我改变自我时:

   def initialize(self):
      self.__type1Value1 = Type1(1)
      self.__type1Value2 = Type1(2)
      self.__type2Value1 = Type2(1)
      self.__type2Value2 = Type2(2)

我收到错误消息TypeError: initialize() missing 1 required positional argument: 'self'

但是在另一个示例中,使用“ self”有效:

class Geek: 

    # Variable defined inside the class. 
    inVar = 'inside_class'
    print("Inside_class2", inVar) 

    def access_method(self): 
        self.inVar="a"
        print("Inside_class3", self.inVar) 

uac = Geek() 
uac.access_method()

输出:

Inside_class2 inside_class
Inside_class3 a

我想念什么?

1 个答案:

答案 0 :(得分:2)

在查找属性值时,如果没有名为self.foo的实例属性,则type(self).foo会退回到foo

但是,当设置一个值时,self.foo始终更新(或在必要时创建)实例属性。您必须显式引用该类才能修改类属性。

在您的另一个示例中,self在您验证了inVar的新实例属性uac的值的情况下“有效”。类属性Geek.inVar保持不变。