【问题标题】:Python 3: Calling a Function from a class, selfPython 3:从类中调用函数,self
【发布时间】:2013-08-30 12:15:15
【问题描述】:

我正在尝试学习课程,有人可以向我解释为什么这段代码不起作用。我认为从类中调用函数时,“self”会自动省略,但解释器告诉我缺少参数“a”(他认为 self = 10)。

#! coding=utf-8
class test:
    def __init__(self):
        "do something here"
    def do(self,a):
        return a**2

d = test.do
print(d(10))

【问题讨论】:

    标签: python class python-3.x


    【解决方案1】:

    先实例化类:

    d = test().do
    print(d(10))  # prints 100
    

    test.do 是一个未绑定的方法,test().do 是绑定的。此线程中解释了差异:Class method differences in Python: bound, unbound and static

    【讨论】:

      【解决方案2】:

      你必须先实例化这个类:

      d = test()
      

      然后你可以调用一个方法:

      print(d.do(10))
      

      【讨论】:

      • @unwind - 以什么方式?
      【解决方案3】:

      如果你想静态使用方法,你必须在 python 中声明它

      #! coding=utf-8
      class test:
          def __init__(self):
              "do something here"
      
          @staticmethod
          def do(a):
              return a**2
      
      d = test.do
      print(d(10)) #and that's work
      

      【讨论】:

        【解决方案4】:

        由于您还没有实例化类(创建的一个花哨的术语),您不能将方法分配给任何随机变量。就像已经说过的,您必须首先创建对象,同时确保您调用的方法是您调用的类的一部分或以某种方式连接到该类(例如创建另一个类,然后将该类与当前类通信) .所以你应该首先输入d=test(),然后输入d.do()。 另外,请记住,在您声明的方法中,您创建了一个参数,所以无论如何您所做的事情本身就是错误的,因为当您声明 do 函数时,您应该将要发送给方法以计算的数字放在括号内它的广场。所以你输入 test.do(10) 然后 10 通过自引用发送到要完成的方法,无论你告诉它做什么。

        还有一件事:虽然这没什么大不了的,但如果你所有的类名都以大写字母开头,这会有所帮助,因为这通常是“pythonic”的做事方式,而且它也会让你的代码变得更丰富更容易阅读,因为当你第一次调用这个类时,有人很容易把它误认为是一个普通的函数

        【讨论】:

          【解决方案5】:
          class test:
              def __init__(self):
                  "do something here"
              def do(self,a):
                  return a**2
              def __call__(self,a):
                  return self.do(a)
          
          a = test
          test.do(a,10)
          #or
          a = test().do
          a(10)
          #or
          a = test()
          test.do(a,10)
          #or
          a = test()
          print(a(10))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-22
            • 1970-01-01
            • 2019-09-13
            相关资源
            最近更新 更多