类方法中的未解析引用

2024-04-29 05:29:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我不认为这是因为函数的范围,但是我得到了

Unresolved reference at get_all_predicates(examples).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"]

有什么帮助吗?


Tags: of函数nametreegetdefcountall
2条回答

如果要调用类方法,则必须使用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

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

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)设置类变量,还不如通过将参数传递给构造函数并使从中计算的其他变量成为实例属性来创建类的实例。我试着写出来,但坦率地说,我不太明白你做得怎么样。

相关问题 更多 >