我只是在研究面向对象的Python ,真的不知道什么时候用self,什么不用.

尤其是当我想要创建一个默认获取对象实例输入的方法,并且还想让它像一个可以获取自定义参数输入的普通方法一样工作时, 对于该方法的所有参数,我都要输入if x is None: x = self.x,这有点麻烦.

示例如下所示.

from dataclasses import dataclass

@dataclass
class PlusCalculator():
    x: int = 1
    y: int = 2
    result: int = None
    
    def plus(self, x=None, y=None):
        if x is None: x = self.x    ## the bothersome part
        if y is None: y = self.y
        
        result = x + y
        self.result = result        ## also confusing...is it good way?
        
        return result
    
pc = PlusCalculator()
print(pc.plus())
print(pc.plus(4,5))

有没有什么好办法用实例变量作为函数参数的缺省值?

推荐答案

条件表达式是可读、快速和直观的-

x = self.x if x is None else x

国王:

有没有什么好办法用实例变量作为函数参数的缺省值?

关于self.result的设置-应该避免这种情况,除非您稍后需要将其作为实例变量进行访问.因此,您可以将其简化为:

@dataclass
class PlusCalculator():
    ...

    def plus(self, x=None, y=None):
        x = self.x if x is None else x
        y = self.y if y is None else y
        return x + y

Python相关问答推荐

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

在Python中使用readline函数时如何向下行

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

通过交换 node 对链接列表进行 Select 排序

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

计算所有前面行(当前行)中列的值

计算相同形状的两个张量的SSE损失

Pandas 在最近的日期合并,考虑到破产

使用FASTCGI在IIS上运行Django频道

重新匹配{ }中包含的文本,其中文本可能包含{{var}

如何根据参数推断对象的返回类型?

如何从具有不同len的列表字典中创建摘要表?

scikit-learn导入无法导入名称METRIC_MAPPING64'

C#使用程序从Python中执行Exec文件

log 1 p numpy的意外行为

调用decorator返回原始函数的输出

无法连接到Keycloat服务器

Django admin Csrf令牌未设置

如何在BeautifulSoup/CSS Select 器中处理regex?

在Admin中显示从ManyToMany通过模型的筛选结果