【问题标题】:How to increase a variable shared by all objects in a class by 1?如何将类中所有对象共享的变量增加1?
【发布时间】:2018-05-12 20:00:57
【问题描述】:

如何创建一个名为 nextyear() 的函数,将所有动物的年龄增加 1?

class Animal:
  def __init__(self, age):
    self.age=age
animal1 = Animal (5)
animal2 = Animal (7)
animal3 = Animal (3)

【问题讨论】:

  • 您想增加所有图像的年龄吗?一口气?

标签: python python-3.x class


【解决方案1】:

你可以使用一个类变量和一个属性:

class Animal:
    year = 0

    def __init__(self, age):
        self._age = age - self.__class__.year

    @property
    def age(self):
        return self._age + self.__class__.year

    @classmethod
    def next_year(cls):
        cls.year += 1


animal1, animal2, animal3 = Animal(5), Animal(7), Animal(3)

for animal in (animal1, animal2, animal3):
    print(animal.age)

print("Next year:")
Animal.next_year()
for animal in (animal1, animal2, animal3):
    print(animal.age)

【讨论】:

  • 好主意。使用类变量在所有类之间共享。使用静态方法来改变它会产生干净的 api。不是外面的杂散功能。
  • 这很干净!
  • 在所有答案中,这可能是最干净的。我不喜欢维护一个实例列表并迭代每个实例的想法会破坏目的。
  • 为避免硬编码类名Animal,请考虑使用@classmethod 而不是静态方法。然后def next_year(cls): cls.year += 1。对于其他其他实例方法,请使用self.__class__.year 而不是Animal.year
  • @pylang 当然,假设在第 2 年,如果你要添加一个 1 岁的新动物,比如 bob = Animal(1),你会希望 bob._age 成为 -1,所以当你得到 bob.age它将返回-1+2 = 1。如果我们不更改__init__,bob 将显示为 3,而不是 1,因为他出生于第 2 年。
【解决方案2】:

您必须保留作为该类实例的动物列表,并添加一个类方法来增加年龄:

class Animal:
    _animals = []
    def __init__(self, age):
        self.age = age
        self._animals.append(self)
        print(self._animals)

    @classmethod
    def one_year_more(cls):
        for animal in cls._animals:
            animal.age += 1

    def __str__(self):
        return "I'm an animal and I'm {} years old".format(self.age)

animal1 = Animal (5)
animal2 = Animal (7)
animal3 = Animal (3)

print(animal1)
# I'm an animal and I'm 5 years old

Animal.one_year_more()

print(animal1)
print(animal2)
# I'm an animal and I'm 6 years old
# I'm an animal and I'm 8 years old

【讨论】:

    【解决方案3】:

    你可以在 Animal 类中添加一个方法来增加年龄:

    class Animal:
        def __init__(self, age):
            self.age=age
    
        def increase_age(self):
            self.age+=1
    

    然后在创建动物时保留它们的列表:

    animals = []
    
    animals.append(Animal(5))
    animals.append(Animal(7))
    animals.append(Animal(3))
    

    使用循环增加年龄:

    for animal in animals:
        animal.increase_age()
    
    for animal in animals:
        print(animal.age)
    

    输出:6 8 4

    【讨论】:

      【解决方案4】:

      在类中添加一个函数:

      class Animal:
          def __init__(self, age):
              self.age=age
          def add_year(self, years=1):
              self.age += years         # adds 1 year by default (accepts a param)
      
      animal1 = Animal (5)
      animal2 = Animal (7)
      animal3 = Animal (3)
      
      for i in (animal1, animal2, animal3):
          i.add_year()
      
      print(animal1.age)
      

      返回

      6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多