我有一个方案,其中类A用参数id,name,email,ticket初始化。然后,在类A的方法中初始化类B,并且需要传递相同的参数,依此类推,以此类推。可以在类声明期间使用装饰器或元类设置这些通用属性。
class A:
def __init__(self, id, name, email, ticket):
self.id = id
self.name=name
self.email=email
self.ticket=ticket
def __somefunc(self):
# do something
b = B(self.id, self.name, self.email, self.ticket)
b.__dosomething()
类似... C类,等等。 我发现将所有这些重复的参数发送给所有后续类有点不合适。
答案 0 :(得分:1)
如果您只是想减少键入的字符数(出现在代码中),请制作一个包含这些值的字典,并实例化其他类。
Class A:
def __init__(self, id, name, email, ticket):
self.id = id
self.name=name
self.email=email
self.ticket=ticket
self.params = {'id':id, 'name':name, 'email':email, 'ticket':ticket}
def __somefunc(self):
# do something
b = B(**self.params)
b.__dosomething()
Can these common attributes be set using a decorator or metaclass during class declaration.
?
是的,也许。
答案 1 :(得分:0)
您可以使用类装饰器将参数“记住”为实例的一部分,因此您可以使用self.args
和self.kwargs
来访问它们:
import functools
def remember_params(cls):
@functools.wraps(cls)
def instance_creator(*args, **kwargs):
obj = cls(*args, **kwargs)
obj.args = args
obj.kwargs = kwargs
return obj
return instance_creator
class B:
def __init__(*args, **kwargs):
print(args, kwargs)
@remember_params
class C:
def __init__(self, id, name, email, ticket):
self.id = id
self.name = name
self.email = email
self.ticket = ticket
def something(self):
b = B(*self.args, **self.kwargs)