使用类实例作为函数参数

时间:2014-11-27 01:08:08

标签: python function class arguments

假设我有类似的东西:

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?

我希望函数能够从类实例获取信息,执行计算,然后保持原始实例不变。

1 个答案:

答案 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

您已将nameweight设为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

现在,nameweight都是实例属性。每个Dog都有唯一的名称和权重,在Dog上更改其中任何一个值都不会再影响其他Dog

有关这方面的更多信息,您可以查看以下来源: