【问题标题】:class attribute within own class自己类中的类属性
【发布时间】:2019-08-20 17:59:29
【问题描述】:

我想在自己的类中拥有一个类实例作为类属性。它是组织该类的一组固定实例。我想我前段时间在 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'这样的实例。

【问题讨论】:

  • 如果有更多像c这样的实例,将它们放入(或添加到)类中感觉是个坏主意。为什么不在课堂之外列出这些实例?

标签: python class attributes


【解决方案1】:

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

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 的实例添加到作为type 的第三个参数传递的dict


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

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

【讨论】:

    【解决方案2】:

    非常感谢您的帮助。我发现了另一种可行的方法:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      相关资源
      最近更新 更多