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