gpt4 book ai didi

python 元类不记得新值

转载 作者:行者123 更新时间:2023-11-30 23:50:16 25 4
gpt4 key购买 nike

我用元类 Spell 编写了一个 Person 类。在元类中,我更改了一个属性,这是可以的,但是如果我想将这个新值用于另一个操作,它不起作用,它会使用以前的值。我该如何解决这个问题?

class Spell(type):
def __new__(cls,classname,super,classdict):
def pph( hours ): return lambda self : classdict['pay_per_hour'] * hours

classdict['pay_per_hour'] = 12
classdict['day_salary'] = pph(8)
return type.__new__(cls, classname, super, classdict )

class Person(metaclass=Spell):
def __init__(self,name,lastname,bday):
self.name = name
self.lastname = lastname
self.bday = bday

def get_name(self):
return self._name
def get_lastname(self):
return self._lastname
def get_bday(self):
return self._bday
def __repr__(self):
return "name: {0}, lastname: {1}, bday: {2}".format(self.name,self.lastname,self.bday)

if __name__ == "__main__":
persona4 = Person("lugdfgca","djfosd","16 febbraio 85")
print(persona4.pay_per_hour)
print(persona4.day_salary())
persona4.pay_per_hour=15
print(persona4.pay_per_hour)
print(persona4.day_salary())

输出为

12
96
15
96

但是 96 是 12*8 而不是 15*8,为什么?错误在哪里?

最佳答案

您创建的 lambda 指的是类构建期间填充的字典。稍后(在类创建之后)对类变量的更改不会反射(reflect)在其中,但即使是这种情况,persona4.pay_per_hour = 15 行也会分配一个新的实例属性,而不是更改类属性。在 pph 生成的函数中使用 self.pay_per_hour 来获取相关实例当前使用的值。

或者,更好的是,取消元类。没有理由在这里使用它们,正如您所看到的,很容易使事情的可扩展性低于所需的水平。

class Spell:
pay_per_hour = 12
hours_per_day = 8

# @property # allows nicer syntax, look it up if you don't know it
def day_salary(self):
return hours_per_day * pay_per_hour

class Person(Spell):
...

这会在实例级别透明地处理 pay_per_hour 和 hours_per_day 的更改。

关于python 元类不记得新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7228676/

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