【问题标题】:Class instance as class variable in python类实例作为python中的类变量
【发布时间】:2014-09-30 10:35:24
【问题描述】:

我正在创建一个类,我希望将其作为单独类的 class 成员,以便第二类的所有实例都可以访问第一类。目前我有一些看起来像这样的东西:

class A:
    def __init__(self):
        print "In Constructor!"

class B:
    ClassA = ''
    def __init__(self, InstanceA):
        self.ClassA = InstanceA

但是,当我尝试使用ClassA 类变量时,我收到抱怨说“str 对象没有属性...”。有没有办法用InstanceA 的参数构造类B,然后以某种方式将其设置为类变量?或任何其他解决方案!

【问题讨论】:

  • 虽然有可能,但这听起来确实是个很糟糕的主意。
  • 拥有共享的班级成员肯定会有用@wim?
  • 是的,这就是类属性的用途,但是每次初始化新实例时共享资源都会发生变化,这听起来像是一个可疑的设计
  • 以上只是伪代码。在我的实际程序中,A 类实际上是另一个更大的类的接口,我希望 B 类的所有实例都能够与之交互。如果您知道实现此目的的更好方法,可以告诉我吗?
  • 如果你想为类的所有实例设置一次,有一个单独的@classmethod来设置它,不要通过__init__来设置。

标签: python class class-variables


【解决方案1】:

您没有在B.__init__ 中分配类属性,只是设置了一个新的实例属性-B.ClassA 仍然是''(顺便说一下,None 将是一个更明智的起始值)。

最小的修复是:

class B:

    ClassA = None

    def __init__(self, InstanceA):
        self.__class__.ClassA = InstanceA # or B.ClassA = ...

但是,请注意,每次创建新实例时都会更改类属性。


根据您的 cmets,这样的内容可能更有帮助:

class B:

    ClassA = None

    @classmethod
    def set_class_attr(cls, instance):
        cls.ClassA = instance

然后你可以像这样使用:

B.set_class_attr(A()) # set class attribute once

b = B() # don't need to pass in new A instances when creating B instances
b.ClassA. # ...

根据您想要的行为,您可以检查该类方法是否已设置实例,例如raise 如果用户尝试重置它,则会出错。

【讨论】:

  • 细微差别:B.__init__ 更新 B.ClassAself.__class__.ClassA 可能是设计决定。
  • 后续问题:当我使用它时,我是从我希望与之交互的大对象内部调用它,所以我说:B.set_class_attr(self),但这会返回 set_class_attr() 的错误必须以 B 作为第一个参数调用
  • 我无法复制这种行为;没有看到minimal example 我不能告诉你你做错了什么。我建议您打开一个新问题,确保您遵循以下清单:meta.stackoverflow.com/questions/260648/…
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2011-02-12
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多