首页 > 解决方案 > 自己类中的类属性

问题描述

我想有一个类实例作为它自己的类中的类属性。它是组织该类的一组固定实例。我想我前段时间在 Java 中做过这个。

打电话

c = A()

课外工作完美。

最小代码示例:

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

但是总有一个错误:NameError: name 'A' is not defined

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

是否可以将“c”作为 A 类的实例?然后我会调用它:

A.c.doSomething()

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

标签: pythonclassattributes

解决方案


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

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给。dicttype


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

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.c,A.dA.eall 引用A. 请注意,add_instances除了假设它可以在没有任何参数的情况下实例化之外,它不会对其应用的类做出任何假设。


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

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

不同之处在于,当语句本身被评估时,语句的主体def只被解析,而不是被评估。一个语句def的主体被逐条评估,以产生一个传递给的。classdicttype


推荐阅读