类中的方法如何访问类常量变量?

时间:2018-08-03 08:41:59

标签: python

我很困惑如何在方法中访问类变量。例如,下面的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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

  

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

是正确的。根据定义,属性查找从实例开始,然后遍历该类及其基类。

您应该注意的是 if 如何您要对阴影属性做出反应。

  • 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()