如何在类主体中将类的实例分配为同一类的属性?

在类A中,我希望将某些“特殊”值存储为类属性。出于无法理解的原因,以下内容不起作用:

class A:
    
   def __init__(self,msg):
        self.s = msg

   X = A("special message")

我可以使用:

class A:
    
   def __init__(self,msg):
        self.s = msg

A.X = A("special message")  # outside of the class

但是它看起来很混乱并且很容易被遗忘(假设类A很长)。有没有一种巧妙的方法可以在类本身内部使用A的实例来初始化A的类变量?

iCMS 回答:如何在类主体中将类的实例分配为同一类的属性?

是否有一种巧妙的方法可以在类本身内部使用A的实例来初始化A的类变量?

,您不能在该类内部使用同一类实例初始化一个类属性 **,因为类的主体首先执行,而您的类在主体执行完成之前未定义。但是也许您可以使用装饰器。我不确定是否比A.X = A("special message")更喜欢它,但是您可以使用:

def add_class_property(name,arg):
    class ClassWrapper:
        def __init__(self,cls):
            self.other_class = cls
            setattr(self,name,cls(arg))

        def __call__(self,*cls_ars):
            return self.other_class(*cls_ars)

    return ClassWrapper


@add_class_property("X","special message")
class A:
    def __init__(self,msg):
        self.s = msg


print(A.X.s)

# Output:
# special message

如果要一次分配多个实例,可以执行以下操作:

def add_class_properties(**kwargs):
    class ClassWrapper:
        def __init__(self,cls):
            self.other_class = cls
            for key,val in kwargs.items():
                setattr(self,key,cls(val))

        def __call__(self,*cls_ars):
            return self.other_class(*cls_ars)

    return ClassWrapper


@add_class_properties(X="special message",Y="another message")
class A:
    def __init__(self,msg):
        self.s = msg

print(A.X.s)
print(A.Y.s)
special message
another message

**:您可以在类的方法中进行操作,但这是另一回事。

本文链接:https://www.f2er.com/2228045.html

大家都在问