【问题标题】:Working with classes and setters and getters使用类、setter 和 getter
【发布时间】:2019-11-26 21:54:48
【问题描述】:

我需要创建一个名为 Color 的类。

  • 代码 1 构造函数
  • 这需要2个参数
  • 代码 2 属性
  • 1 个属性是公开的
  • 1 个属性是私有的
  • 为 1 个私有属性创建访问器和设置器
  • 实例化上面创建的类
  • 输出两个属性

我相信我已经能够创建类和构造函数,但我遇到的问题是公共/私有属性以及其他部分困扰着我。

class Color:
   def __init__(self,full_name,birthday ):
       self.name = full_name
       self.birthday = birthday

   def age(self):
      return self.birthday

   def fname(self):
       return _self.name

object = Color()

【问题讨论】:

  • def age 和 def fname 应该在类中
  • 这不是一个答案,但它是相关的,你应该阅读它:stackoverflow.com/a/4555970/5709499
  • return _self.name ← 这将引发错误。你的意思是return self._name 吗?
  • 这里使用术语“属性”,但措辞听起来像是“属性”的意思。我建议澄清任务的意图;属性是存储在实例中的实际值,属性是访问器,其使用类似于属性,但调用函数来满足它们,而不是直接在实例上查找值。

标签: python class oop


【解决方案1】:

使用 python @property getter 和 setter 装饰器,从实例对它们的调用是无法区分的。
内部工作遵循私有属性的前下划线约定,而不诉诸double underscore name mangling

class Homework:

    def __init__(self, param1, param2):
        self._param1 = param1    # private attribute
        self.param2 = param2     # public attribute

    @property
    def param1(self):
        """accessor for private parameter
        """
        return self._param1

    @param1.setter
    def param1(self, value):
        """setter for private parameter
        """ 
        self._param1 = value

homework = Homework('The great secret', 'The public life of Napoleon')

# accessing the parameters follow the same syntax
print(homework.param1)
print(homework.param2)

# setting the parameters also follow the dotted syntax
homework.param1 = "you won't believe it"    
homework.param2 = 'but the dog ate it'    

print(homework.param1)
print(homework.param2)

【讨论】:

  • 注意:如果他们真正的意思是 private,而不仅仅是“非公开”/按惯例受保护,那么它应该是 self.__param1(两个下划线),而不是 @987654325 @(一个下划线)。单下划线表示“受保护”或“不属于公共 API”,其中双下划线采用名称修饰来根据类名分隔属性名称。
  • 是的,同意 - 如果它们真的意味着私有,那么 python 可能不是一个好的选择。
猜你喜欢
  • 2015-01-20
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2011-06-13
  • 2021-09-21
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多