我在herehere中读到,可以使用=为Python方法设置别名.

然而,当我在__init__方法上try 它时,它似乎不起作用.

class MyClass:
    def __init__(self):
        print("Hi mum!")
    
    new_name = __init__

a = MyClass()
b = MyClass.new_name()

b = MyClass.new_name()导致此错误:

TypeError: __init__() missing 1 required positional argument: 'self'

为什么这不管用呢?我应该如何正确地给__init__起别名呢?

推荐答案

__init__不是构造函数.__new__才是.__init__是在通过静态方法__new__构造实例之后对实例执行初始化的实例方法.当您使用MyClass()调用类时,同时调用__new____init__的原因是因为这是MyClass的类型或元类的__call__方法所做的事情.

因此,如果您希望正确地为类的构造函数设置别名,则可以为其元类的__call__方法设置别名:

class AliasedConstructor(type):
    new_name = type.__call__

class MyClass(metaclass=AliasedConstructor):
    def __init__(self):
        print("Hi mum!")

MyClass.new_name()

或者,您可以将别名设置为classmethod描述符,将type.__call__绑定到当前类:

class MyClass:
    def __init__(self):
        print("Hi mum!")

    new_name = classmethod(type.__call__)

这两种方法都将产生:

Hi mum!

Python相关问答推荐

使用decorator 重复超载

Pandas 按照特殊规则保留每n行

customtkinter中使用的这个小部件的名称是什么

删除pandas rame时间序列列中未更改的值

模型序列化器中未调用现场验证器

如何通过多2多字段过滤查询集

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

pandas DataFrame GroupBy.diff函数的意外输出

如何根据参数推断对象的返回类型?

发生异常:TclMessage命令名称无效.!listbox"

用合并列替换现有列并重命名

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

Python键入协议默认值

将tdqm与cx.Oracle查询集成

mypy无法推断类型参数.List和Iterable的区别

Flask运行时无法在Python中打印到控制台

将链中的矩阵乘法应用于多组值