假设我有类似的东西:
class Dog:
name = ""
weight = 0
def __init__(self,name,wg):
self.name = name
self.wg = wg
def feed(pet):
pet.weight = pet.weight + 5
if pet.weight > 20:
print("your dog would get too fat")
else:
print("it is safe to feed your dog")
my_dog = Dog("sparky",10)
feed(my_dog)
是否有任何方法可以将pet.weight的更改转移到my_dog.weight?
我希望函数能够从类实例获取信息,执行计算,然后保持原始实例不变。
答案 0 :(得分:2)
您要在此行重新分配pet.weight
属性的值:
pet.weight = pet.weight + 5
即使代码已从pet
函数返回,执行此操作也会影响feed
实例。
要解决此问题,只需创建一个等于pet.weight + 5
的本地名称,然后使用该名称:
def feed(pet):
weight = pet.weight + 5
if weight > 20:
print("your dog would get too fat")
else:
print("it is safe to feed your dog")
现在,我们使用pet.weight
的值,但要避免更改它。
另外,您已经错误地定义了您的课程。通过这样做:
class Dog:
name = ""
weight = 0
您已将name
和weight
设为Dog
的类属性。这意味着它们的值将在Dog
的所有实例之间共享,修改它们将影响所有实例。换句话说,您的所有Dog
都具有相同的名称和权重。
但是你这样做:
def __init__(self,name,wg):
self.name = name
使用相同名称的实例属性覆盖了类属性name
。与类属性不同,实例属性对于类的每个实例都是唯一的。因此,weight
仍然是一个类属性(由所有Dog
共享),而name
现在是一个实例属性(每个Dog
都是唯一的)。
我认为最好删除这些行并编写Dog
类,如下所示:
class Dog:
def __init__(self, name, weight):
self.name = name
self.weight = weight
现在,name
和weight
都是实例属性。每个Dog
都有唯一的名称和权重,在Dog
上更改其中任何一个值都不会再影响其他Dog
。
有关这方面的更多信息,您可以查看以下来源: