类方法中未解析的引用

时间:2016-02-14 15:02:41

标签: python function scope

我不认为这是因为该功能的范围,但我得到了

  

get_all_predicates的未解析引用(示例).count(predicate_list [0])

我的班级get_entropy_of_attributes(examples, predicate_list)中的Tree内部功能:

class Tree:

    def get_examples(examples, attributes):
        for value in examples:
            yield dict(zip(attributes, value.strip().replace(" ", "").split(',')))

    def get_all_predicates(examples):
        return [d['Predicate'] for d in examples]

    def get_entropy_of_attributes(examples, predicate_list):
        get_all_predicates(examples).count(predicate_list[0])
        return 0

    examples = list(get_examples(all_examples, name_of_attributes))

    predicate_list = list(set(get_all_predicates(examples)))

    get_entropy_of_attributes(examples, predicate_list)

all_examples是字典列表,name_of_attributes是一个列表,用于保存从文本文件导入的值。

all_examples = [{'P_Length': '1.4', 'P_Width': '0.2', 'Predicate': 'I-setosa', 'Sepal_Width': '3.5', 'S_Length': '5.1'}, ...]

name_of_attributes = ["Check","P-Width"]

任何帮助?

2 个答案:

答案 0 :(得分:4)

类没有作用域,只有名称空间。这意味着在其中定义的函数无法自动查看其他类变量。

class Foo(object):
    var = 1              # lets create a class variable
    def foo():
        print(var)       # this doesn't work!

要访问类变量,您需要使用属性语法:Foo.var(通过类访问),或者,如果您正在编写实例方法,请使用self.var(通过当前实例,将作为第一个参数传入。)

class Bar(object):
    var = 1
    def bar1():
        print(Bar.var) # works
    def bar2(self):
        print(self.var) # also works, if called on an instance, e.g. `Bar().bar2()`

通过这种设置,你可以几乎修复你当前的代码(但不是很完整)。

def get_entropy_of_attributes(examples, predicate_list):
    Tree.get_all_predicates(examples).count(predicate_list[0])     # name the class
    return 0

如果在完全初始化类之后调用它,它将无任何异常地工作(尽管它的实现似乎有点荒谬)。但是,当您调用它来定义类变量时,它不起作用,就像您当前的代码那样。那是因为在所有类主体运行之后,只创建了类对象并将其绑定到类名

我认为解决这个问题的方法可能是以更传统的方式重新设计你的课程。您可能应该通过将参数传递给构造函数并使用它们计算的其他变量实例属性来创建类的实例,而不是根据各种全局变量(如all_examples)设置类变量。我试着把它写出去,但坦率地说,我不明白你做得还不错。

答案 1 :(得分:3)

如果要调用类方法,则必须使用self调用它们,例如

class myClass:

    def __init__(self):
        pass

    def get_all_predicates(self):
        print('asd')

    def do_something(self):
        self.get_all_predicates()  # working
        get_all_predicates()  # → Unresolved reference

test = myClass()
test.do_something()

有关Python类的示例,请参阅this link