类属性在自己的类中

2024-10-01 17:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在自己的类中有一个类实例作为类属性。它是用来组织该类的一组固定实例的。我想我很久以前用Java做过这个

召唤

c = A()

课外活动做得很好

最小代码示例:

class A:
    c = A()
    def __init__(self):
        self.B = 1
    def doSomething(self):
        print(self.B)

但总有一个错误:NameError:未定义名称“a”

----> 2     c = A()
NameError: name 'A' is not defined

是否可以将“c”作为类a的实例? 然后我会用以下方式来称呼它:

A.c.doSomething()

等等。 当然,在真正的代码中有更多像“c”这样的实例


Tags: 实例代码self示例属性initdef错误
2条回答

这是可能的,但是您必须先完成类的定义,然后才能实例化它

class A:
    def __init__(self):
        self.B = 1

    def doSomething(self):
        print(self.B)

A.c = A()

class语句提供了一种比显式调用type更具声明性的方法来创建类。以上相当于

def A_init(self):
    self.B = 1

def A_doSomething(self):
    print(self.B)

A = type("A", (), {'__init__': A_init, 'doSomething': A_doSomething})
del A_init, A_doSomething

必须先完成对type的调用,然后才能将A的实例添加到作为第三个参数传递给typedict


您可能会发现装饰器使类属性的添加更“原子化”:

def add_instances(*names):
    def _(cls):
        for name in names:
            setattr(cls, name, cls())
        return cls
    return _

@add_instances("c", "d", "e")
class A:
    def __init__(self):
        self.B = 1

    def doSomething(self):
        print(self.B)

将导致A.cA.dA.e都引用A的不同实例。请注意add_instances没有对应用它的类做出任何假设,只是假设它可以在没有任何参数的情况下实例化


如果您想知道为什么可以通过引用当前定义的函数来编写递归函数:

def factorial(n):
    return 1 if n == 0 else n*factorial(n-1)

不同之处在于def语句的主体在对def语句本身进行求值时,只进行分析,而不是求值。一个class语句的主体被一个语句一个语句地求值,以生成一个传递给typedict

非常感谢你的帮助。我找到了另一种有效的方法:

class A:
    @staticmethod
    def initiate_instances():
        A.c = A()

    def __init__(self):
        self.B = 1

    def doSomething(self):
        print(self.B)

A.initiate_instances()
A.c.doSomething()

相关问题 更多 >

    热门问题