【问题标题】:How do methods within a class access class constant variables?类中的方法如何访问类常量变量?
【发布时间】:2018-08-03 08:41:58
【问题描述】:

我很困惑如何在方法中访问类变量。例如,下面的 compare 方法可以通过哪些方式使用类变量 COURSES?我通过在调用 COURSES (self.COURSES.items()) 之前添加 self 来使其工作,但这是正确的吗?我觉得这是不好的做法,我错过了一些东西,但我似乎找不到答案。谢谢大家。

class Example:
    COURSES = {
    "Python Basics": {"Python", "functions", "variables",
                      "booleans", "integers", "floats",
                      "arrays", "strings", "exceptions",
                      "conditions", "input", "loops"},
    "Java Basics": {"Java", "strings", "variables",
                    "input", "exceptions", "integers",
        }


    def compare(self, arg):
        intersection_list = []
        for key, value in COURSES.items():
        if value & arg:
            intersection_list.append(key)
        return intersection_list

【问题讨论】:

标签: python


【解决方案1】:

是的,使用self. COURSES 是可以的。 Python有所谓的“数据继承”。当您编写self. COURSES 时,它会在self.__dict__ 中查找COURSES。如果在那里找不到该属性,则搜索self.__class__.__dict__ - 并找到您的类属性。如果没有找到该属性,则搜索类的__dict__父类。

另请参阅:https://www.python-course.eu/python3_class_and_instance_attributes.php

【讨论】:

    【解决方案2】:

    我通过在调用 COURSES (self.COURSES.items()) 之前添加 self 来使其工作,但这样正确吗?

    没错。根据定义,属性查找从实例开始,然后遍历类及其基类。

    您应该注意的是如果以及如何您希望对阴影属性做出反应。

    • self.COURSES 允许实例和子类为自己隐藏属性。
    • type(self).COURSES 允许子类但不允许实例隐藏属性。
    • Example.COURSES 不允许阴影。

    你可以试试这个例子的不同之处:

    class Lookup(object):
        ATTRIBUTE = 'Base'
    
        def lookup(self):
            print(self.ATTRIBUTE)       # instance, class and base
            print(type(self).ATTRIBUTE) # class and base
            print(Lookup.ATTRIBUTE)     # base
    
    
    class SubLookup(Lookup):
        ATTRIBUTE = 'Sub'
    
    
    print('>> base class')
    Lookup().lookup()
    print('>> sub class')
    SubLookup().lookup()
    print('>> instance')
    foo = SubLookup()
    foo.ATTRIBUTE = 'Instance'
    foo.lookup()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-08
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多