gpt4 book ai didi

python - 在 Python 中使用 __getattribute__ 或 __getattr__ 调用方法

转载 作者:太空狗 更新时间:2023-10-29 18:17:00 24 4
gpt4 key购买 nike

我正在尝试创建一个子类,它充当自定义类列表。但是,我希望列表继承父类的方法和属性,并返回每个项目的数量总和。我正在尝试使用 __getattribute__ 方法执行此操作,但我不知道如何将参数传递给可调用属性。下面高度简化的代码应该解释得更清楚。

class Product:
def __init__(self,price,quantity):
self.price=price
self.quantity=quantity
def get_total_price(self,tax_rate):
return self.price*self.quantity*(1+tax_rate)

class Package(Product,list):
def __init__(self,*args):
list.__init__(self,args)
def __getattribute__(self,*args):
name = args[0]
# the only argument passed is the name...
if name in dir(self[0]):
tot = 0
for product in self:
tot += getattr(product,name)#(need some way to pass the argument)
return sum
else:
list.__getattribute__(self,*args)

p1 = Product(2,4)
p2 = Product(1,6)

print p1.get_total_price(0.1) # returns 8.8
print p2.get_total_price(0.1) # returns 6.6

pkg = Package(p1,p2)
print pkg.get_total_price(0.1) #desired output is 15.4.

实际上我有很多父类的方法必须是可调用的。我意识到我可以为类似列表的子类手动覆盖每一个,但我想避免这种情况,因为将来可能会向父类添加更多方法,我想要一个动态系统。任何意见或建议表示赞赏。谢谢!

最佳答案

这段代码很糟糕,根本不是 Pythonic。你无法在 __getattribute__ 中传递额外的参数,所以你不应该尝试像这样做任何隐含的魔法。最好这样写:

class Product(object):
def __init__(self, price, quantity):
self.price = price
self.quantity = quantity

def get_total_price(self, tax_rate):
return self.price * self.quantity * (1 + tax_rate)

class Package(object):
def __init__(self, *products):
self.products = products

def get_total_price(self, tax_rate):
return sum(P.get_total_price(tax_rate) for P in self.products)

如果需要,可以使包装器更通用,例如

class Package(object):
def __init__(self, *products):
self.products = products

def sum_with(self, method, *args):
return sum(getattr(P, method)(*args) for P in self.products)

def get_total_price(self, tax_rate):
return self.sum_with('get_total_price', tax_rate)

def another_method(self, foo, bar):
return self.sum_with('another_method', foo, bar)

# or just use sum_with directly

显式优于隐式。此外,组合通常优于继承。

关于python - 在 Python 中使用 __getattribute__ 或 __getattr__ 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com