如何更改对象的 Super Class?

How to change the Super Class of an Object?

我在 Python 中有一个包含方法和构造函数的 class。构造函数的 return 值将是一个对象,但我需要一个 class (构造函数)的 return 值,例如 numbers.Number 类型。

是否可以通过添加 numbers.Number 作为此 class 的超级 class 来更改 class 的 return 值,如果可以,可以有人描述一下怎么做吗?


class Num(Parent):
    #Some Code
    #Here Parent must be inherited

class Foo(Num):
    #Foo Should return of type numbers.Number
    #Here Num must be inherited

现在,每当我们调用 Foo.

的构造函数时,我希望 Foo 变为 return number.Number

这可以通过标准 class inheritance 来完成。

from numbers import Number

class MyNumber(Number):
    def is_number(self):
        return isinstance(a, Number)

a = MyNumber()
print(a.is_number())

需要注意的是numbers module are Abstract Base Classes(ABCs)的所有classes都不能被实例化。它们类似于其他语言中的接口(如 Java),并以相应的类型实现,例如int 实施 numbers.Integral.

通过使用 numbers.Number 作为基础 class,您将在 MyNumber 中拥有 class 的所有操作,但是如果您用一个值实例化它喜欢 MyNumber(2) 你会得到 TypeError: object() takes no parameters.

也许你要继承int类型:

class MyClass(int):
    ....

我不确定您这样做的目的是什么,也不确定您期望结果如何。但是,由于 numbers.Number 是一个 abc(抽象基础 class),这意味着您可以简单地将自己的 class 视为其子 class 之一通过使用 abc 注册它。 (没有必要像我最初想的那样覆盖 __new__,因为我没有意识到 numbers.Number 是一个 abc。)

我的意思是:

import numbers

class Parent(object):
    # Added only to make script runnable
    pass

class Num(Parent):
    #Some Code
    #Here Parent must be inherited
    pass

class Foo(Num):
    #Foo Should return of type numbers.Number
    #Here Num must be inherited
    pass

numbers.Number.register(Foo)

foo = Foo()
print(isinstance(foo, numbers.Number))  # -> True