NameError:全局名称“ MyClass”未在Pepper / Nao中定义

时间:2018-11-03 12:40:35

标签: python-2.7 class nao-robot pepper choregraphe

更新:要解决 Choregraphe 和Python的组合问题,我拒绝使用@classmethod的想法。相反,当我想使用MyCustomClass时,会在MyClass中引发AlMemory事件。

我读了许多有关NameError的帖子,但仍然找不到解决我问题的方法。

我使用Nao的Python框和 Choregraphe 编写了一个程序。

我得到以下信息:

class MyClass(GeneratedClass): #GeneratedClass is given

 def __init__(self):
    GeneratedClass.__init__(self)

 @classmethod
 def doSomething(cls, a):
    print a

class myCustomClass():
 def func(self):
    MyClass.doSomething(a)

从myCustomClass调用func()时,我在 MyClass 上收到了NameError

  

[ERROR] behavior.box:FMBox :: createPythonModule:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1275012824__root__test_1:用户类评估失败,并显示以下错误:      全局名称“ MyClass”未定义

我该如何解决?

2 个答案:

答案 0 :(得分:0)

首先,您的@method类结构错误的

当我运行您的代码时,它会说:

class MyClass(GeneratedClass):

 @classmethod
 def do(self, a):
     return a

class myCustomClass():
 def func(self):
    MyClass.do(a)

输出:

Traceback (most recent call last):
  File "test.py", line 236, in <module>
    class MyClass(GeneratedClass):
NameError: name 'GeneratedClass' is not defined

您的课程结构是完全错误的。如果要传递参数,请使用__init__方法。

class MyClass:
    def __init__(self, GeneratedClass):
        self.generated_class = GeneratedClass

     def do(self):
         doSomething(self.generated_class)

class MyCustomClass:
    def func(self):
        GeneratedClass = 1
        MyClass(GeneratedClass).do()

myCustomClass().func()

如果您使用的是@methodclass,则不应通过self,它是cls。像本例一样:

from datetime import date

# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)

    def display(self):
        print(self.name + "'s age is: " + str(self.age))

person = Person('Adam', 19)
person.display()

person1 = Person.fromBirthYear('John',  1985)
person1.display()

如果您尝试继承,请以以下示例为例。

class Mapping:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

现在根据自己的情况全部

class GeneratedClass:
    def __init__(self):
        self.myclass = self

    def print(self):
        print('hello_people')

class MyClass(GeneratedClass):

    def __init__(self,a):
        self.a = a
        GeneratedClass.__init__(self)
        print(a)

    @classmethod
    def give_param(cls, a):
        return cls(a)

class myCustomClass:
    def func(self):
        MyClass.give_param('aa')

myCustomClass().func()

注意::我使用了 python 3.x

答案 1 :(得分:0)

我认为,当您按下run时,Choregraphe / PythonBridge解释器会即时替换“ MyClass”。

如您所见,每个编排框类都被命名为“ MyClass”,它们被替换并被生成的名称(如root / class / boxname ...)更改。

您可以尝试在MyClass中调用并打印self.getName()以获得线索。

因此,您可以:

  1. 直接在myClass中添加doSomething
  2. 创建一个未后处理的,例如:

为:

class MyVeryOneClass:
 def __init__(self):
    ...