类实例作为python中的类变量

类实例作为python中的类变量,python,class,class-variables,Python,Class,Class Variables,我正在创建一个类,我希望它是一个单独类的类成员,这样第二个类的所有实例都可以访问第一个类。目前,我有一些东西看起来像这样: class A: def __init__(self): print "In Constructor!" class B: ClassA = '' def __init__(self, InstanceA): self.ClassA = InstanceA 然而,当我尝试使用ClassAclass变量时,我收到抱怨

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

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

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

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

您没有在
B中分配class属性。uuu init_uuuu
,只是设置一个新的实例属性-
B。ClassA
仍然是
'
是一个更合理的起始值,顺便说一句)

最基本的解决方案是:

class B:

    ClassA = None

    def __init__(self, InstanceA):
        self.__class__.ClassA = InstanceA # or B.ClassA = ...
但是,请注意,这会在每次创建新实例时更改class属性


根据您的评论,类似这样的内容可能更有帮助:

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. # ...

根据您想要的行为,您可以在classmethod中检查实例是否已设置,例如,
如果用户试图重置它,则会引发一个错误。

虽然可能,但这听起来是一个非常粗糙的想法。当然,共享类成员在@wim中很有用?是的,这就是类属性的用途,但是,让共享资源在每次初始化新实例时都发生更改闻起来像是一种可疑的设计,上面所说的只是伪代码。在我的实际程序中,类A实际上是另一个更大类的接口,我希望类B的所有实例都能够与之接口。如果您知道更好的方法来实现这一点,您能告诉我吗?如果您想为类的所有实例设置一次,请使用单独的
@classmethod
来设置它,不要通过
\uuuuu init\uuuuu
来做。微妙的区别:这可能是一个设计决定,是否更新
B.ClassA
self.\uuuu class\uuuuuuu.ClassA
。后续问题:当我使用它时,我是从我希望与之交互的大对象内部调用它,所以我说:B.set\u class\u attr(self),但这会返回一个错误,即set_class_attr()必须使用B作为第一个参数调用,因为我无法复制此行为;没有看到一张照片,我无法告诉你你做错了什么。我建议你提出一个新问题,确保你遵循以下清单: