我们可以在 __new__ 中分配实例属性吗?
Can we assign instance attributes in __new__?
例如,如果我们喜欢:
class blah(object):
def __new__(self, **attr):
try: self.isBlah = attr["true_or_false"]
def __init__(self, **attr):
if self.isBlah:
self.blah = self.isBlah
a = blah(true_or_false=True)
print(a.blah)
我知道__new__
一个先开始,但是我们可以给它赋值吗?因为当我在 Python 解释器上执行时,它不会,但在网站编译器中,它会。
是的,这是可能的。传递给 __new__
的第一个参数是要创建实例的 class。因此,为了执行您想要的操作,必须首先创建 class 实例——然后您可以在返回它之前向其添加属性。
下面是根据您问题中的代码执行此操作的示例。请注意,在编写 Python 代码时,通常最好遵循 PEP 8 - Style Guide for Python Code — particularly the Naming conventions.
class Class:
def __new__(cls, **kwargs):
attr = kwargs.get('true_or_false', False)
inst = super().__new__(cls)
inst.is_blah = attr
return inst
def __init__(self, **kwargs):
if self.is_blah:
self.blah = self.is_blah
c = Class(true_or_false=True)
print(c.blah) # -> True
例如,如果我们喜欢:
class blah(object):
def __new__(self, **attr):
try: self.isBlah = attr["true_or_false"]
def __init__(self, **attr):
if self.isBlah:
self.blah = self.isBlah
a = blah(true_or_false=True)
print(a.blah)
我知道__new__
一个先开始,但是我们可以给它赋值吗?因为当我在 Python 解释器上执行时,它不会,但在网站编译器中,它会。
是的,这是可能的。传递给 __new__
的第一个参数是要创建实例的 class。因此,为了执行您想要的操作,必须首先创建 class 实例——然后您可以在返回它之前向其添加属性。
下面是根据您问题中的代码执行此操作的示例。请注意,在编写 Python 代码时,通常最好遵循 PEP 8 - Style Guide for Python Code — particularly the Naming conventions.
class Class:
def __new__(cls, **kwargs):
attr = kwargs.get('true_or_false', False)
inst = super().__new__(cls)
inst.is_blah = attr
return inst
def __init__(self, **kwargs):
if self.is_blah:
self.blah = self.is_blah
c = Class(true_or_false=True)
print(c.blah) # -> True