【问题标题】:How can I reference another class instance variable when getting or setting another?在获取或设置另一个类实例变量时如何引用另一个类实例变量?
【发布时间】:2018-07-25 09:18:14
【问题描述】:

每个人都说要使用 self.variable_name ,但这仅在获取或设置它的方法内有效。设置一个时,我需要能够使用实例中设置的其他变量的值。

class WebSite:

    def __init__(self, url='', subdomain='www'):
        self.url = url
        self.subdomain = subdomain

    @property
    def url(self):
        return self.__url

    @url.setter
    def url(self, url):
        self.__url = f'http://{self.subdomain}.example.com'

    @property
    def subdomain(self):
        return self.__subdomain

    @subdomain.setter
    def subdomain(self, subdomain):
        self.__subdomain = subdomain

然后:

>>>import package as p
>>>site = p.website()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/dblack/Code/package/package/website.py", line 4, in __init__
    self.url = url
  File "/Users/dblack/Code/package/package/website.py", line 13, in url
    self.__url = f'http://{self.subdomain}.site.com'
  File "/Users/dblack/Code/package/package/website.py", line 17, in subdomain
    return self.__subdomain
AttributeError: 'WebSite' object has no attribute '_WebSite__subdomain'

我试了很多次,这一定是完全错误的做法。

【问题讨论】:

  • 您需要在self.url 之前初始化self.subdomain,因为url 的setter 引用self.subdomain. Note that url 的setter 并没有多大意义:它完全忽略你给它的参数!
  • 你是对的。这是一个精简的例子,对不起!
  • 你为什么在这里使用双下划线名称修饰??
  • @juanpa.arrivillaga 我正在学习课程python-course.eu/python3_properties.php
  • @jasonharper 你是对的!解决了这个问题。

标签: python python-3.x class getter-setter instance-variables


【解决方案1】:

当然有可能,但是您的代码具有相互关联的依赖关系。设置url 属性会查找self.subdomain,它会调用subdomain 属性,后者又会查找self.__subdomain 的值——它还不存在。

您至少应该先设置self.subdomain。但是,您应该重新考虑为 subdomain 设置 getter 和 setter;直接设置an属性即可。无论哪种方式,您都应该避免使用双下划线前缀,因为这会导致名称混淆并导致您可能无法预料的行为;如果必须设置隐藏属性,请使用单个下划线前缀。

【讨论】:

    【解决方案2】:

    一些问题。

    • 您将类成员 url 定义为属性,将实例成员 url 定义为变量。实例成员在查找时会影响类成员。
    • 您无需先在构造函数中创建即可访问​​.__url 实例成员。
    • 您为私有变量.__url 定义了一个普通的getter和一个普通的setterIt makes no sense。如果你想要一个世界可写的值,只需使用一个变量; Python 不是 Java。

    【讨论】:

    • .__url 不是问题,我相信是.__subdomain
    • 仍然不正确,表明对正在发生的事情缺乏了解。我建议提出可能可行的最简单的设计,让它发挥作用,然后从那里改进。
    • @9000 我从您的评论中学到的 python 数量不容小觑。谢谢!
    猜你喜欢
    • 2015-06-09
    • 2023-03-28
    • 1970-01-01
    • 2016-11-12
    • 2023-03-08
    • 1970-01-01
    • 2012-05-21
    • 2020-04-14
    相关资源
    最近更新 更多