NameError: глобальное имя "MyClass" не определено в Pepper/Nao

Обновление: чтобы обойти комбинацию Choregraphe и Python, я отверг идею о @classmethod, Вместо этого я поднимаю события AlMemory в MyCustomClass когда я хочу использовать MyClass,

Я прочитал много сообщений на NameError, но все еще не мог найти решение моей проблемы.

Я пишу программу с помощью Choregraphe, используя окно Python для Nao.

Я получил следующее:

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)

При звонке func() из myCustomClass, я получил NameError на MyClass.

[ОШИБКА] поведение.box:FMBox::createPythonModule:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1275012824__root__test_1: сбой при оценке класса пользователя с ошибкой: глобальное имя "MyClass" не определено

Как я могу это исправить?

2 ответа

Я думаю, что "MyClass" заменяется на лету интерпретатором Choregraphe/PythonBridge, вызываемым при нажатии run.

Как вы можете видеть, каждый класс блоков хореографа называется "MyClass", поэтому они заменяются и изменяются сгенерированным именем, таким как root/class/boxname...

Вы можете попробовать вызвать и распечатать self.getName() в MyClass, чтобы получить подсказку.

Так что в вашем случае вы могли бы:

  1. добавить doSomething прямо в myClass
  2. создать постобработку, например:

как:

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

Как начать свой @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.

Другие вопросы по тегам