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, чтобы получить подсказку.
Так что в вашем случае вы могли бы:
- добавить doSomething прямо в myClass
- создать постобработку, например:
как:
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.