【问题标题】:setting self variables based on each other基于彼此设置自变量
【发布时间】:2023-03-22 03:22:01
【问题描述】:

python中的快速问题 假设我的课是这样的

class Enemy():
   def __init__(self, level):
      self.level = level
      self.damage = self.level + 5

问题是,由于 self.damage 值在 self.level 更改时不会更新,所以我怎样才能让它做到这一点?我尝试在线搜索,但我不知道这叫什么,所以我找不到任何帮助

【问题讨论】:

  • 使damage 成为一个返回self.level + 5 的方法。
  • 您可以使用@property 来创建一个行为类似于属性并允许一些更复杂的行为的函数
  • @ScottHunter 但是我不是每次升级都必须调用这个方法吗?
  • @Macattack 我现在就去看看!
  • 否;每次您想知道damage 的值时都会调用它。

标签: python class oop self


【解决方案1】:

您可以使用properties。也许你知道其他编程语言的 getter 和 setter 方法。属性是它们的 Python 等价物。在这种情况下,您只需要一个 getter 方法。

class Enemy():
   def __init__(self, level):
      self.level = level

   @property
   def damage(self):
      return self.level + 5

美妙之处在于,您仍然可以访问 damage 作为实例上的属性,例如 enemy.damage,而无需显式调用该方法,它会自动完成。

【讨论】:

    【解决方案2】:

    除了使用属性,你还可以对函数而不是变量进行破坏:

    def damage():
        return self.level + 5
    

    【讨论】:

      【解决方案3】:

      这是一篇关于properties的好文章:
      https://www.freecodecamp.org/news/python-property-decorator/

      它们允许您控制访问属性的方式,这样如果您决定需要进行更改,将来可以更轻松地更新它们。例如,您可以更改值或使其可变,而不是固定 +5,而调用该属性的任何内容都不会受到影响。

      稍后您可以通过使用@damage.setter 添加一种手动设置伤害的方法。

      class Enemy():
        '''This holds the data and functionality for enemies'''
      
        def __init__(self, level):
          self.level = level
          # Show the damage being set
          print(self.damage)
      
        @property
        def damage(self):
          return self.level + 5
      

      【讨论】:

      • 您不能为 self.damage 分配 int 值,这是属性。运行这个 sn-p 实际上会产生一个 AttributeError。
      • 你说得对,没有保存我最后的更改。固定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多