Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取或设置另一个类实例变量时,如何引用另一个类实例变量?_Python_Python 3.x_Class_Getter Setter_Instance Variables - Fatal编程技术网

Python 获取或设置另一个类实例变量时,如何引用另一个类实例变量?

Python 获取或设置另一个类实例变量时,如何引用另一个类实例变量?,python,python-3.x,class,getter-setter,instance-variables,Python,Python 3.x,Class,Getter Setter,Instance Variables,每个人都说要使用self.variable_name,但这只在获取或设置它的方法内部起作用。我需要能够在设置一个变量时使用实例中设置的其他变量的值 class WebSite: def __init__(self, url='', subdomain='www'): self.url = url self.subdomain = subdomain @property def url(self): return self

每个人都说要使用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
然后:

>>将包作为p导入
>>>site=p.网站()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/dblack/Code/package/package/website.py”,第4行,在__
self.url=url
url中第13行的文件“/Users/dblack/Code/package/package/website.py”
self.uu url=f'http://{self.subdomain}.site.com'
子域中的第17行文件“/Users/dblack/Code/package/package/website.py”
返回self.\u子域
AttributeError:“网站”对象没有属性“\u网站\u子域”

我尝试了很多欺骗,这肯定是完全错误的方法。

这当然是可能的,但您的代码具有相互关联的依赖关系。设置
url
属性将查找
self.subdomain
,该属性调用
subdomain
属性,该属性将依次查找尚不存在的
self.\uu subdomain
的值

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

许多问题

  • 将类成员
    url
    定义为属性,将实例成员
    url
    定义为变量。实例成员在查找时隐藏类成员
  • 您可以访问
    。\uu url
    实例成员,而无需首先在构造函数中创建它
  • 为私有变量
    \uu url
    定义一个普通getter和一个普通setter。如果您想要一个世界可写值,只需使用一个变量;Python不是Java

您需要在
self.url
之前初始化
self.subdomain
,因为
url
的setter引用了
self.subdomain。请注意,
url`的setter没有什么意义:它完全忽略了您给它的参数!你说得对。这是一个简单的例子,对不起!你为什么在这里使用双下划线的名称弄乱???@juanpa.arrivillaga我正在学习一门课程@jasonharper你是对的!这就解决了这个问题。
。\uuuu url
不是问题所在,我相信它是
。\uuu子域
。它仍然是不正确的,并且表明对发生的事情缺乏了解。我建议提出可能可行的最简单设计,使其可行,并从中进行改进。@9000我从您的评论中学到的python数量是不可低估的。非常感谢。
>>>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'