python - 如何用不同的对象替换 __init__() 中的实例?

标签 python oop

我在 ClassA 中调用了一个构造函数,如果满足某个条件,我希望生成的对象属于不同的类 (ClassB)。我尝试将第一个参数替换为 __init__() (在下面的示例中为'self')within __init__() 但它似乎没有达到我想要的效果。

主要:

import ClassA

my_obj = ClassA.ClassA(500)
# unfortunately, my_obj is a ClassA, but I want a ClassB!

在 ClassA/__init__.py 中:

import ClassB

class ClassA:
    def __init__(self,theirnumber):
        if(theirnumber > 10):
            # all big numbers should be ClassB objects:
            self = ClassB.ClassB(theirnumber)
            return
        else:
            # numbers under 10 are ok in ClassA.
            return

在 ClassB/__init__.py 中:

class ClassB:
    pass

最佳答案

您需要__new__()为了那个原因。 (假设您使用的是 Python 2,您还需要通过子类化 object 使其成为一种新型类。)

class ClassA(object):
    def __new__(cls,theirnumber):
        if theirnumber > 10:
            # all big numbers should be ClassB objects:
            return ClassB.ClassB(theirnumber)
        else:
            # numbers under 10 are ok in ClassA.
            return super(ClassA, cls).__new__(cls, theirnumber)

__new__()__init__() 之前作为类实例化过程的一部分运行.基本上 __new__()是实际创建新实例的内容,__init__()然后调用以初始化其属性。这就是为什么您可以使用 __new__()但不是 __init__()更改创建的对象类型:一次 __init__()开始,对象已经被创建,改变它的类型为时已晚。 (嗯...不是真的,但这涉及到非常神秘的 Python 黑魔法。)见 the documentation .

不过,在这种情况下,我会说工厂函数更合适,比如

def thingy(theirnumber):
    if theirnumber > 10:
        return ClassB.ClassB(theirnumber)
    else:
        return ClassA.ClassA(theirnumber)

顺便提一下,如果你按照我对 __new__() 所做的那样做上面,如果 ClassB返回,__init__()你在 ClassA 中写的方法不会ClassB 上调用实例!当您构建 ClassB实例内部 ClassA.__new__() , 自己的__init__()方法( ClassB.__init__() )将在那时运行,所以希望 Python 不应该运行另一个不相关的 __init__() 是有意义的。同一对象上的方法。但这可能会让人感到困惑,这可能是支持工厂函数方法的另一个论据。

关于python - 如何用不同的对象替换 __init__() 中的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209233/

相关文章:

python - 在 Pandas 数据框中定位元素时减少执行时间

c++ - 来自 "Designed Patterns Explained"的桥接模式示例

oop - 函数式编程与面向对象编程

php - 为什么人们在声明类时经常省略 public/private/protected?

PHP OOP 有很多 setter、getter

python - Scipy 的 solve_bvp 和耦合微分方程的性能问题

python - 为什么 `datetime.strptime` 得到的 2015 年第 0 周星期二的日期不正确?

python - 使用 Mamp 设置 Django 项目?

python - Groupby,转置每个组并乘以 pandas 数据框中的原始组

c++ - 使用私有(private)类数据模式的成本是多少?