Python类:如何构建它

时间:2016-01-25 15:51:54

标签: python class ros

我正在尝试创建一个名为ListenerVilma的类,它有两种方法:" Clock _"和"诊断_"。然而,两种方法都会调用内部函数。以下代码显示了我尝试实现上述行为,但是当我调用ListenerVilma.Clock_()时,得到以下错误:

  

TypeError:未绑定的方法必须使用ListenerVilma实例作为第一个参数调用Clock_()(没有取而代之)

如何创建我的类ListenerVilma ???

感谢。

.col-xs-4

3 个答案:

答案 0 :(得分:0)

错误在ListenerVilma.Clock_()中的第41行,这里您直接使用类的方法,因此没有隐式参数传递,并且需要一个ListenerVilma实例。解决方案是ListenerVilma().Clock_()这首先创建一个类的实例,然后从实例调用它的Clock_方法。

除此之外,你的类构造非常奇怪,__init__用于初始化class,基本类构造就是这样

class Foo:
    """example class"""

    def __init__(self,*argv,**karg):
        """initialize this class"""
        #do something with argv and/or karg according to the needs
        #for example this
        print "init argv", argv
        print "init karg", karg
        self.ultimate=42

    def do_stuff(self):
        """this method do something"""
        print "I am doing some stuff"
        print "after 7.5 million years of calculations The Answer to the Ultimate Question of Life, the Universe, and Everything is: ", self.ultimate

    def do_some_other_stuff(self,*argv,**karv):
        """this method do something else"""
        print "method argv", argv
        print "method karg", karg

# basic usage            
test = Foo(1,2,3,key_test=23)
test.do_stuff()
test.do_some_other_stuff(7,8,9,something=32)
test.ultimate = 420
test.do_stuff()

我不太确定你的意图是什么,但你建立Clock_Diagnostics_作为一个班级,但他们不是,而现在他们什么都不做,如果你想要他们上课自己做什么

class Clock_:
    def __init__(self):
        self.listener()

    def callback(self, clock):
        print clock

    def listener(self):
        rospy.Subscriber('clock', Clock, self.callback)

Diagnostics_相同,我没有看到listener方法的原因,所以我会把它在__init__中做的,但也许是rospy需要它?我不知道,但对于它的外观,它应该用作

rospy.init_node('listener', anonymous=True)
Clock_()
Diagnostics_()
rospy.spin()

答案 1 :(得分:-1)

Clock_方法不属于该类;它是一个'实例'方法。 有两个选项

  • 在main函数中:创建一个ListenerVilma实例:listener = ListenerVilma()
  • ListenerVilma类中:使用@classmethod注释方法,并使该类继承自object:class ListenerVilma(object):。但请记住,您的方法中的第一个参数将是对类的引用,而不是对实例的引用。

答案 2 :(得分:-1)

以下代码可以更好地执行我想要的行为。 :)

class ListenerVilma:

    def CLOCK(self):

        def clock_sub():
            rospy.Subscriber('clock', Clock, clock_callback)

        def clock_callback(clock):
            print clock

        clock_sub()


    def DIAGNOSTICS(self):

        def diagnostics_sub():
            rospy.Subscriber('diagnostics', DiagnosticArray, diagnostics_callback)

        def diagnostics_callback(diagnostics):
            print diagnostics

        diagnostics_sub()

if __name__ == '__main__':
    rospy.init_node('listener', anonymous=True)
    myVilma = ListenerVilma()
    myVilma.CLOCK()
    myVilma.DIAGNOSTICS()
    rospy.spin()