【问题标题】:Python class depending on variable [duplicate]Python类取决于变量[重复]
【发布时间】:2017-03-22 22:39:19
【问题描述】:

有没有办法根据传递的变量动态更改对象类?例如:

class Parent:
    def __init__(self, variable):
        ...
        some magic
        ...

class ChildA:
    pass

class ChildB:
    pass


cls=Parent('a')
cls.__class__
<class '__main__.ChildA'>

cls=Parent('b')
cls.__class__
<class '__main__.ChildB'>

【问题讨论】:

  • 考虑这些实际上是否应该是单独的类,如果应该是,考虑通过某种工厂函数而不是Parent(whatever)创建实例是否更好。
  • 一个简单的谷歌搜索带来了this。 Google 是您的朋友。

标签: python oop inheritance


【解决方案1】:

这可以在父类的__new__ 方法中完成。它可以决定真正创建什么对象:

class Parent(object):
    def __new__(cls, selector):
        if selector == 'a':
            return object.__new__(A)
        else:
            return object.__new__(B)

class A(Parent):
    letters = 'aaaaa'

class B(Parent):
    letters = 'bbbbb'

a = Parent('a')
print(a.letters)
b = Parent('b')
print(b.letters)

输出证明它有效:

aaaaa
bbbbb

【讨论】:

  • 任何对 python 核心开发者的答案投反对票的人都应该有勇气解释为什么他们认为这是一个糟糕的答案。
【解决方案2】:

__init__之前的类父类的__new__函数中定义条件检查if,else。

class Parent(Object):
   def __new__(self,s):
       if s=='a':
         return object.__new__(childA)
       else:
         return object.__new__(childB)
class childA(Parent):
   pass
class childB(Parent):
   pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多