【问题标题】:Self is required as an argument需要自我作为参数
【发布时间】:2015-04-07 19:14:07
【问题描述】:

我正在 python2.7 上使用 kivy。据我所知, self 不是一个真正的参数,而是在处理父数据时在函数中使用的工具。然而在下面的使用中,python 认为 self 是一个真正的参数。这是因为我在函数中调用它吗?

class Verdo(BoxLayout):
    defualtval = ""
    tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])
    istipitxt = StringProperty(defualtval)
    iscitxt = StringProperty(defualtval)
    iskodtxt = StringProperty(defualtval)
    baslabittxt = StringProperty(defualtval)
    parcanotxt = StringProperty(defualtval)



    def start(self):
        Clock.schedule_interval(self.callback, 0.5)

    def callback(self, dt):
        print "testo"
        self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])

    start()   
    #Clock.schedule_interval((lambda dt: updater(), 1), 0.5)   
    #Clock.schedule_interval((lambda dt: tell(), 1), 0.5)

代码运行时出现如下错误:

2015-04-07 22:05:03.081739
 Traceback (most recent call last):
   File "/home/toshy/workspace/Verdo_reborn/main.py", line 28, in <module>
     class Verdo(BoxLayout):
   File "/home/toshy/workspace/Verdo_reborn/main.py", line 79, in Verdo
     start()   
 TypeError: start() takes exactly 1 argument (0 given)

我还尝试了一种更简单的方法,但也失败了:

def callback(self, dt):
    print "testo"
    self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])

Clock.schedule_interval(callback, 0.5)

输出:

     ret = callback(self._dt)
 TypeError: callback() takes exactly 2 arguments (1 given)

【问题讨论】:

  • 你的缩进正确吗?在您的示例中,您在没有对象的情况下调用 start()(例如 x.start())。
  • 我遇到的问题是类被 kivy 主循环调用,这就是为什么我试图让函数在类中运行。

标签: python kivy


【解决方案1】:

你应该打电话给:

 self.start()

self 一个真正的参数,但它是作为调用方法的对象自动提供的。

您可能希望在两种不同的情况下调用.start()。第一个是在实例化 Verdo 类型的对象之后:

 my_verdo = Verdo()
 my_verdo.start()

或者,您可以从内部调用 Verdo 的代码。在这种情况下,您需要指定您正在对当前实例进行操作。

【讨论】:

  • 他不应该在类体内调用“start”。
  • 我不清楚意图是什么。我可以更准确地写成“如果你试图从 Verdo 的类定义中调用 start,你应该写......”。
  • 仍然,尝试从在 Python 中定义它的类主体调用实例方法在至少 3 种不同的方式中是错误的。该代码在问题中,您没有澄清它-您只是在任何上下文之外列出self.start。在类主体中,这将失败并以“NameError”开头。
【解决方案2】:

你应该这样做:

class Verdo(BoxLayout):
    defualtval = ""
    tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])
    istipitxt = StringProperty(defualtval)
    iscitxt = StringProperty(defualtval)
    iskodtxt = StringProperty(defualtval)
    baslabittxt = StringProperty(defualtval)
    parcanotxt = StringProperty(defualtval)



    def start(self):
        Clock.schedule_interval(self.callback, 0.5)

    def callback(self, dt):
        print "testo"
        self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])    

if __name__ == '__main__':
    verdoInstance = Verdo()
    verdoInstance.start()

这只是一个示例,如果您想将代码作为单个可执行 python 脚本快速测试。 你的错误是你试图调用你的类方法而不在你的类代码中调用构造函数。在这种情况下,方法类确实在等待 self (object ref) 作为第一个参数,但当时还没有创建对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2016-08-05
    相关资源
    最近更新 更多