Python 如何将类的实例指定为类主体中同一类的属性?
在classPython 如何将类的实例指定为类主体中同一类的属性?,python,class-variables,Python,Class Variables,在classA中,我希望将一些“特殊”值存储为类属性。出于可以理解的原因,以下操作不起作用: 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
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.X=A(“特殊消息”)
,但现在您可以:
def add_class_属性(名称,参数):
类包装器:
定义初始化(自我,cls):
self.other_class=cls
setattr(self、name、cls(arg))
定义呼叫(自我,*cls):
返回self.other_类(*cls_ars)
返回类包装器
@添加类属性(“X”,“特殊消息”)
A类:
定义初始化(self,msg):
self.s=msg
印刷品(A.X.s)
#输出:
#特别信息
如果要同时分配多个实例,可以执行以下操作:
def添加类属性(**kwargs):
类包装器:
定义初始化(自我,cls):
self.other_class=cls
对于键,kwargs.items()中的val:
setattr(自身、键、cls(val))
定义呼叫(自我,*cls):
返回self.other_类(*cls_ars)
返回类包装器
@添加类属性(X=“特殊消息”,Y=“其他消息”)
A类:
定义初始化(self,msg):
self.s=msg
印刷品(A.X.s)
印刷品(A.Y.s)
特别信息
另一条消息
**:您可以在类的方法中执行此操作,但这是另一回事
有没有一种简洁的方法可以在类本身内部用一个实例初始化一个类变量
否,您不能在类中使用同一类的实例初始化类属性**因为首先执行类的主体,直到主体的执行完成才定义类。但也许你可以找个装饰师。我不确定您是否更喜欢它,而不是A.X=A(“特殊消息”)
,但现在您可以:
def add_class_属性(名称,参数):
类包装器:
定义初始化(自我,cls):
self.other_class=cls
setattr(self、name、cls(arg))
定义呼叫(自我,*cls):
返回self.other_类(*cls_ars)
返回类包装器
@添加类属性(“X”,“特殊消息”)
A类:
定义初始化(self,msg):
self.s=msg
印刷品(A.X.s)
#输出:
#特别信息
如果要同时分配多个实例,可以执行以下操作:
def添加类属性(**kwargs):
类包装器:
定义初始化(自我,cls):
self.other_class=cls
对于键,kwargs.items()中的val:
setattr(自身、键、cls(val))
定义呼叫(自我,*cls):
返回self.other_类(*cls_ars)
返回类包装器
@添加类属性(X=“特殊消息”,Y=“其他消息”)
A类:
定义初始化(self,msg):
self.s=msg
印刷品(A.X.s)
印刷品(A.Y.s)
特别信息
另一条消息
**:您可以在类的方法中执行此操作,但这是另一回事。您的第二个选项似乎不错。我不知道你为什么或者谁会认为它很容易被忘记,但如果有必要,你可以添加注释来提醒任何人他们应该记住的东西。是我忘记了,然后花了一段时间来弄清楚发生了什么。我70岁了,记忆和注意力都不像我第一次编程时那样集中(Fortran 66,大约1973年,然后是1974年的BCPL)。你的第二个选择似乎不错。我不知道你为什么或者谁会认为它很容易被忘记,但如果有必要,你可以添加注释来提醒任何人他们应该记住的东西。是我忘记了,然后花了一段时间来弄清楚发生了什么。我70岁了,记忆和注意力都不像我第一次编程时那样集中(Fortran 66,大约1973年,然后是1974年的BCPL)。 special message another message