使用装饰器或元类将通用实例变量设置为所有类

时间:2019-03-06 19:40:45

标签: python python-3.x metaprogramming

我有一个方案,其中类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类,等等。 我发现将所有这些重复的参数发送给所有后续类有点不合适。

2 个答案:

答案 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.argsself.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)