【问题标题】:Python classes - Call multiple class methods in one line [duplicate]Python类 - 在一行中调用多个类方法[重复]
【发布时间】:2021-10-12 14:56:40
【问题描述】:

我正在尝试组合一些类方法或对其自身应用初始化值但没有成功。

class numOper:
    def __init__(self, x):
        self.x = x
        
    def multiply(self, x):
        self.x *= x

    def add(self, x):
        self.x += x


a = numOper(5)
print(a.x) # 5
a.multiply(3)
print(a.x) # 15
a.add(7)
print(a.x) # 22


a = numOper(5) # x = 5
a.multiply(3).add(7) # Error; trying multiply and then add to result
print(a.x)

a = numOper(5) # x = 5
a.multiply(a) # Error; trying to multiply by itself

这些结果

AttributeError: 'NoneType' object has no attribute 'multiply'
AttributeError: 'NoneType' object has no attribute 'add'

有没有办法做到这些?还是调查?

在程序化 python 中,这似乎可行。

a = 5

def addf(a):
    a += a
    return a

addf(a)

a = 5

def addf(a):
    a += a
    return a

def double(a):
    a *= 2
    return a

double(addf(a))

【问题讨论】:

  • 您必须返回 self 才能链接方法调用
  • DeepSpace 所说的...但是,请务必仔细考虑此 API 可能会造成混淆,因为它会在内部修改 numOper 的状态作为副作用。
  • 傻瓜,本来可以这么想的!感谢所有贡献者。
  • 您可能还想查看您的类的特殊方法,例如__iadd__,它专门覆盖+=,因此您可以在代码中包含a += 3

标签: python class oop self


【解决方案1】:

multiplyadd 不会显式返回任何内容,因此它们会隐式返回 None,因此您会看到错误。您可以改为显式返回 self,以便继续对其调用方法:

class numOper:
    def __init__(self, x):
        self.x = x
        
    def multiply(self, x):
        self.x *= x
        return self # Here!

    def add(self, x):
        self.x += x
        return self # And here!

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 2022-12-04
    • 1970-01-01
    • 2015-02-22
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多