【问题标题】:Proper syntactic reference for Python class attributesPython 类属性的正确语法参考
【发布时间】:2021-04-17 18:04:52
【问题描述】:

已经知道 Python 中类和实例属性之间的区别,这两者中哪一个是引用类属性的正确方法?

import requests


class SomePage:
    
    PAGE_URL = 'www.someurl.com'

    def __init__(self) -> None:
        # Option A
        self.request_a = requests.get(self.PAGE_URL)
        # Option B
        self.request_b = requests.get(SomePage.PAGE_URL)

任何选项的结果都是相同的。有没有更好的?

【问题讨论】:

  • request 未定义 -- 应该是 requests。但实际上,为了举例,你还不如直接使用print,比如print(self.PAGE_URL); print(SomePage.PAGE_URL)。参考见minimal reproducible example
  • 是的,对不起,我在没有任何编辑器的情况下即时做了这个例子,除了 Stack Overflow。感谢您的建议

标签: python python-3.x class attributes


【解决方案1】:

这些是不一样的,所以你使用什么取决于你的意图。如果我们考虑以下示例,这一点就会变得很清楚:

class Foo:
    bar = 42
    def method1(self):
        return self.bar
    def method2(self):
        return Foo.bar

class Baz(Foo):
    bar = 99

baz = Baz()

在repl中:

>>> baz.method1()
99
>>> baz.method2()
42

所以,self.PAGE_URL检查实例命名空间,然后是类命名空间,然后是类方法解析顺序中的所有命名空间

另一方面,Foo.bar检查Foo 的命名空间,然后检查 Foo 的方法解析顺序中的所有命名空间

【讨论】:

  • 我还要添加 type(self).bar 来检查类命名空间,然后是 MRO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多