繁体   English   中英

仅当 Python Class 中未定义时才覆盖使用自变量

[英]Override use self variables only if they are not defined in Python Class

我对 Python 类有疑问,是否有更 Pythonic 的方式来执行以下操作?

I have a class where I define some class variables, but when I class a class function, I'd like to be able to override some of the variables and if I don't, I'd like to use the 'self' version .

这是一个简单的例子(在我的实际代码中,我的 class 有很多变量可以被覆盖,因此我想找到一个更好的方法来做到这一点):

class MyClass:
    def __init__ (self, A, B):
        self.A = A
        self.B = B

    def calc_C (self, A=False, B=False):  
        if A == False :
            A = self.A
        if B == False :
            B = self.B
        return A * B

x = MyClass(5, 6)

这返回 30:

x.calc_C()

这返回 5:

x.calc_C(B=1)

感谢任何建议。 谢谢

如果你有很多这样的变量,装饰器可能会派上用场来执行这个基于自我的默认操作:

这是装饰器:

import inspect

def selfy(func):
    def wrapper(*args, **kwargs):
        # Extract the "self"
        self, = args

        # Get the parameters the function "func" accepts
        sig = inspect.signature(func)
        params = [param for param in sig.parameters if param != "self"]  # ["A", "B"]

        # Make the selfified version of arguments
        selfed_kwargs = {var: kwargs.get(var, getattr(self, var)) for var in params}

        # Call the function with this "selfifed" arguments
        return func(*args, **selfed_kwargs)
    return wrapper

class 看起来像:

class MyClass:
    def __init__ (self, A, B):
        self.A = A
        self.B = B

    @selfy
    def calc_C (self, A=None, B=None):  
        return A * B

并且您可以使用关键字 arguments 调用该方法,但是您喜欢:

x = MyClass(5, 6)
x.calc_C()          # 5*6 = 30
x.calc_C(A=12)      # 12*6 = 72
x.calc_C(B=-7)      # 5*-7 = -35
x.calc_C(A=4, B=9)  # 4*9 = 36

它是如何工作的?

装饰器selfy可以访问感兴趣的 function 的调用方式。 所有 arguments 和关键字 arguments 都可以在*args**kwargs中访问。

例如,如果我们调用x.calc_C(A=12) ,那么args是一个包含x实例的 1 元组; 并且kwargs{"A": 12}的字典。 现在,在inspect.signature的帮助下,我们访问 function 签名( calc_C的签名)并以列表形式获取参数名称["self", "A", "B"]

在这里,我们对显式参数感兴趣,即AB 现在我们需要做的就是查看这些参数中的每一个,并从用户传递的关键字 arguments dict 中获取它们的值,即 dict {"A": 12} (如果存在); 或者从self那里得到它。 这就是kwargs.get(var, getattr(self, var))的作用。

例如,当var"A"时,我们得到12 ,因为它存在于kwargs dict 中。 但是对于"B" ,因为它在kwargs dict 中不存在,所以.get返回它的第二个参数,即self.B (这是由getattr提供的)。

您可以根据需要向calc_C添加很多变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM