更新:要解决 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”未定义
我该如何解决?
答案 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()以获得线索。
因此,您可以:
为:
class MyVeryOneClass:
def __init__(self):
...