NameError: глобальное имя «MyClass» не определено в Pepper / Nao - PullRequest
0 голосов
/ 03 ноября 2018

Обновление: чтобы обойти комбинацию 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 ]

0 голосов
/ 06 ноября 2018

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

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

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

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

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

как:

class MyVeryOneClass:
 def __init__(self):
    ...
0 голосов
/ 03 ноября 2018

В качестве начала ваша @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 .

...