Python __init__ 和 classmethod,它们必须具有相同数量的参数吗?
Python __init__ and classmethod, do they have to have the same number of args?
所以 class 方法可以用作 python 中的替代“构造函数”,它们绑定到 class 而不是实例,到目前为止非常清楚。但我的问题是,是否必须在 class 方法的返回实例中具有与 __init__
中相同数量的参数。更确切地说:
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
return cls(name,surname)
如果我尝试创建一个实例 Myclass("alex")
工作正常,但如果我尝试创建一个实例 Myclass.alternative_init("alex","james")
我有一个 TypeError
,因为我传递给许多参数,而 init 只需要 2 。我错过了什么吗?
你可以像这样做你想做的事:
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
new_instance = cls(name)
new_instance.surname = surname
return new_instance
a = MyClass.alternative_init('Bob', 'Spongy')
print(a.name, a.surname)
# Bob Spongy
__init__
只接受一个参数,名称。因此,您可以将 name
或 surname
传递给 cls
,但不能同时传递两者。但是,您可以在 classmethod
中创建一个 class 实例,并添加一个额外的参数:
class MyClass(object):
def __init__(self,name):
self.name=name
def __setattr__(self, name, val):
self.__dict__[name] = val
@classmethod
def alternative_init(cls,name,surname):
v = cls(name)
v.surname = surname
return v
因为 Myclass.alternative_init("alex","james")
调用 cls(name, surname) 与 MyClass(name,surname)
相同,也与 __init__(self,name,surname)
相同,但您的 __init__
函数没有 surname
参数。您可以通过 __init__(self,name,surname=None)
使 surname
可选
class MyClass(object):
def __init__(self,name,surname=None):
self.name=name
self.surname=surname
@classmethod
def alternative_init(cls,name,surname):
return cls(name,surname)
在Python中,传递给方法的第一个参数总是对象本身。
如果您现在使用名称调用您的方法,您将获得 self 作为第一个参数,名称作为第二个参数。
当您现在从类方法内部调用 init 方法时,python 不知道它应该如何处理姓氏。
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
return cls(name)
a = MyClass("alex")
MyClass.alternative_init("alex","james")
所以 class 方法可以用作 python 中的替代“构造函数”,它们绑定到 class 而不是实例,到目前为止非常清楚。但我的问题是,是否必须在 class 方法的返回实例中具有与 __init__
中相同数量的参数。更确切地说:
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
return cls(name,surname)
如果我尝试创建一个实例 Myclass("alex")
工作正常,但如果我尝试创建一个实例 Myclass.alternative_init("alex","james")
我有一个 TypeError
,因为我传递给许多参数,而 init 只需要 2 。我错过了什么吗?
你可以像这样做你想做的事:
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
new_instance = cls(name)
new_instance.surname = surname
return new_instance
a = MyClass.alternative_init('Bob', 'Spongy')
print(a.name, a.surname)
# Bob Spongy
__init__
只接受一个参数,名称。因此,您可以将 name
或 surname
传递给 cls
,但不能同时传递两者。但是,您可以在 classmethod
中创建一个 class 实例,并添加一个额外的参数:
class MyClass(object):
def __init__(self,name):
self.name=name
def __setattr__(self, name, val):
self.__dict__[name] = val
@classmethod
def alternative_init(cls,name,surname):
v = cls(name)
v.surname = surname
return v
因为 Myclass.alternative_init("alex","james")
调用 cls(name, surname) 与 MyClass(name,surname)
相同,也与 __init__(self,name,surname)
相同,但您的 __init__
函数没有 surname
参数。您可以通过 __init__(self,name,surname=None)
surname
可选
class MyClass(object):
def __init__(self,name,surname=None):
self.name=name
self.surname=surname
@classmethod
def alternative_init(cls,name,surname):
return cls(name,surname)
在Python中,传递给方法的第一个参数总是对象本身。 如果您现在使用名称调用您的方法,您将获得 self 作为第一个参数,名称作为第二个参数。
当您现在从类方法内部调用 init 方法时,python 不知道它应该如何处理姓氏。
class MyClass(object):
def __init__(self,name):
self.name=name
@classmethod
def alternative_init(cls,name,surname):
return cls(name)
a = MyClass("alex")
MyClass.alternative_init("alex","james")