有没有办法自动绑定(bind)到 self
(部分)__init__
方法的参数?
我的意思是:
class Person:
@lazy_init
def __init__(self, name, age, address):
...
... 而不是:
class Person:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
...
我想知道人们是否已经在这种情况下使用过类似的东西。或者有什么理由我一开始就不应该这样做?
最佳答案
这绝对是可能的,这里有一个有点幼稚的实现:
from functools import wraps
def lazy_init(init):
import inspect
arg_names = inspect.getargspec(init)[0]
@wraps(init)
def new_init(self, *args):
for name, value in zip(arg_names[1:], args):
setattr(self, name, value)
init(self, *args)
return new_init
class Person:
@lazy_init
def __init__(self, name, age):
pass
p = Person("Derp", 13)
print p.name, p.age
一旦您开始拥有映射到属性的属性以外的东西,您就会遇到麻烦。您至少需要某种方法来指定将哪些参数初始化为属性……到那时,它只会变得比它的值(value)更麻烦。
关于用于自动绑定(bind) __init__ 参数的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048329/