gpt4 book ai didi

当将特定字符串呈现给父类的构造函数时,将子类的实例分配给变量的 Pythonic 方法

转载 作者:太空狗 更新时间:2023-10-30 01:03:55 25 4
gpt4 key购买 nike

我希望能够创建父类 X 的实例,并将字符串“Q”作为额外参数。
该字符串是一个名称,是父类 X 的子类 Q 的标识符。
我希望父类的实例成为(或被替换为)子类的实例。

我知道这可能是一个经典问题(错误?)。经过一番搜索,我还没有找到合适的解决方案。
我自己想出了以下解决方案;
我在父类的 init 方法中添加了一个可能的标识符字典作为其基类实例的键。
然后将对应子类的class属性赋给当前实例class属性。
我要求 init 方法的参数不是默认值,以防止无限循环。
以下是代码在实践中的示例;

class SpecialRule:
""""""
name="Special Rule"
description="This is a Special Rule."
def __init__(self, name=None):
""""""
print "SpecialInit"
if name!=None:
SPECIAL_RULES={
"Fly" : FlyRule(),
"Skirmish" : SkirmishRule()
} #dictionary coupling names to SpecialRuleclasses
self.__class__= SPECIAL_RULES[name].__class__

def __str__(self):
""""""
return self.name

class FlyRule(SpecialRule):
""""""
name="Fly"
description="Flies."
def __init__(self):
""""""
print "FlyInit"+self.name
SpecialRule.__init__(self)
def addtocontainer(self, container):
"""this instance messes with the attributes of its containing class when added to some sort of list"""

class SkirmishRule(SpecialRule):
""""""
name="Skirmish"
description="Skirmishes."
def __init__(self):
""""""
SpecialRule.__init__(self)
def addtocontainer(self, container):
"""this instance messes with the attributes of its containing class when added to some sort of list"""

test=SpecialRule("Fly")
print "evaluating resulting class"
print test.description
print test.__class__
</pre></code>

输出:

<p></p>

<blockquote>
<blockquote>
<p>>
SpecialInit
FlyInitFly
SpecialInit
evaluating resulting class
Flies.
<strong>main</strong>.FlyRule
>
</p></blockquote></blockquote>

是否有更 pythonic 的解决方案,我的解决方案是否存在可预见的问题?(我是否误认为在子类的 .__init__ 中显式调用父类的 .__init__(self) 是一种良好的编程习惯?)。我的方案感觉有点……不对……

快速回顾一下;
感谢您的快速回答

@Mark Tolonen的解决方案
我一直在研究 __new__-method,但是当我尝试在 Mark Tolonen 的 Z 子类示例中创建 A、B 和 C 时,我得到了类 Z 尚未定义的错误。此外,我不确定是否可以以正常方式实例化类 A(在 Z 的范围之外使用 variable=A() ),除非您已经创建了一个子类的实例并将该类调用为一个实例的属性Z 的子类......这似乎不是很简单。 __new__ 非常有趣,所以我会多花点时间,你的例子比我从 pythondocs 得到的更容易理解。

@Greg Hewgill 的解决方案
我尝试了静态方法解决方案,它似乎工作正常。我之前研究过使用单独的函数作为工厂,但我猜想在主 block 中使用一系列松散的构造函数代码来管理大型程序会很困难,所以我很高兴将它集成到类中。
我做了一些实验,看看是否可以将 create-method 变成装饰性的 .__call__() 但它变得非常困惑,所以我将保留它。

最佳答案

我会通过使用封装对象选择的函数来解决这个问题:

class SpecialRule:
""""""
name="Special Rule"
description="This is a Special Rule."
@staticmethod
def create(name=None):
""""""
print "SpecialCreate"
if name!=None:
SPECIAL_RULES={
"Fly" : FlyRule,
"Skirmish" : SkirmishRule
} #dictionary coupling names to SpecialRuleclasses
return SPECIAL_RULES[name]()
else:
return SpecialRule()

我使用了 @staticmethod 装饰器来允许您在没有对象实例的情况下调用 create() 方法。你会这样调用它:

SpecialRule.create("Fly")

关于当将特定字符串呈现给父类的构造函数时,将子类的实例分配给变量的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3383733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com