【问题标题】:Modifying Function Arguments in Python to Access Private Fields Within a Class在 Python 中修改函数参数以访问类中的私有字段
【发布时间】:2021-11-27 19:03:59
【问题描述】:

我正在尝试创建一个包含字段列表的类。请参阅下面的代码。

class Character:
    # Private Fields:
    __age = 18
    __weight = 200
    __height = 72
    
    def __init__(self, name):
        self.__name = name
        
    @property
    def get_age(self):
        return self.__age
    @property
    def get_name(self):
        return self.__name
    @property
    def get_weight(self):
        return self.__weight
    @property
    def get_height(self):
        return self.__height
    
person = Character("someone")

print("name =", person.get_name,",", "age =", person.get_age)

有没有办法避免为您要访问的每个私有字段编写@property?例如,有没有办法将属性传递给更通用的 getter 函数,例如:

def get_attr(self,attr):
    #set attr to __attr
    #return self.attr

我尝试使用join函数,但没有成功

感谢您的帮助

【问题讨论】:

  • 使用数据类?
  • 你检查过namedtuple()类生成器吗?
  • 你能...直接访问这些字段吗? Getter 是 Python 中的一种反模式,属性旨在创建看起来像字段的方法。只需公开这些字段即可。
  • 这看起来像您正在尝试用 Python 编写 Java。尝试在类级别初始化实例属性,编写 getter,在这些 getter 的名称中写“get”...
  • Python 没有私有字段。这是理解的关键。请注意,您所有的propertys 都是完全没有意义。只需删除它们,并使用常规属性 self.name 等,在 __init__ 中初始化

标签: python oop


【解决方案1】:

要回答所提出的问题,简单的解决方案是补偿对私有成员进行的名称修改。例如获取您将使用的__age 属性:person._Character__age

但是,这将是一个糟糕的主意,我不会推荐它。如果您需要它们易于访问,只需删除下划线即可。如果它们确实需要私有,那么无论如何都不应该从课堂外轻松访问它们,因此采取一种使它们易于访问的方式会破坏目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2017-12-21
    • 2012-11-16
    • 2013-09-29
    • 1970-01-01
    • 2023-03-04
    • 2021-07-23
    相关资源
    最近更新 更多