【问题标题】:Python calling method without 'self'没有'self'的Python调用方法
【发布时间】:2013-09-11 20:30:03
【问题描述】:

所以我刚开始用 python 编程,我不明白“self”背后的全部原因。我知道它几乎就像一个全局变量一样使用,因此可以在类中的不同方法之间传递数据。我不明白为什么在同一个类中调用另一个方法时需要使用它。如果我已经在那个班,我为什么要告诉它??

例如,如果我有: 为什么我需要 self.thing()?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

【问题讨论】:

  • 打开 Python 解释器并运行 import this 以了解 Python 的大部分语言决策。
  • @ColinValliant:像“现在总比没有好。虽然从不经常比现在更好。 Pythoness,并没有真正帮助回答这个问题。

标签: python class self


【解决方案1】:

我尝试了下面的代码,该代码在类中声明了带有 out 参数的方法,并使用类名调用了方法。

class Employee:

    def EmpWithOutPar():
        return 'Hi you called Employee'

print(Employee.EmpWithOutPar())

输出: 你好,你打电话给员工

【讨论】:

    【解决方案2】:

    对我来说,self 就像一个作用域定义器,self.foo() 和 self.bar 表示在类中定义的函数和参数,而不是在其他地方定义的那些。

    【讨论】:

      【解决方案3】:

      您还可以在static 类中创建方法,因此不需要self。但是,如果您确实需要,请使用它。

      你的:

      class bla:
          def hello(self):
              self.thing()
      
          def thing(self):
              print "hello"
      

      静态版:

      class bla:
          @staticmethod
          def hello():
              bla.thing()
      
          @staticmethod
          def thing():
              print "hello"
      

      【讨论】:

      • 我知道这是一篇较旧的帖子,但您能否举一个使用静态方法的场景示例?
      • @uitty400 静态方法对一个或多个静态变量进行操作。例如,您有一个静态变量来记录迄今为止创建的实例数。然后可以使用静态方法来增加该计数器。
      • @uitty400 非静态方法可以访问静态变量,但静态方法不能访问非静态变量。
      • @Developer,您不需要 thing 定义中的 self 参数。这支持完全不使用@staticmethod,只通过类名前缀引用方法
      【解决方案4】:

      简短的回答是“因为你可以将def thing(args) 作为一个全局函数,或者作为另一个类的方法。举这个(可怕的)例子:

      def thing(args):
          print "Please don't do this."
      
      class foo:
          def thing(self,args):
              print "No, really. Don't ever do this."
      
      class bar:
          def thing(self,args):
              print "This is completely unrelated."
      

      这很糟糕。不要这样做。但如果你这样做,你可以打电话给thing(args)某事会发生。如果您有相应的计划,这可能是一件好事:

      class Person:
          def bio(self):
              print "I'm a person!"
      
      class Student(Person):
          def bio(self):
              Person.bio(self)
              print "I'm studying %s" % self.major
      

      上面的代码使得如果你创建一个Student类的对象并调用bio,它会做所有的事情如果它是Person类有自己的@ 987654328@ 调用并且之后它会做自己的事情。

      这涉及到继承和其他一些你可能还没有看到的东西,但期待它。

      【讨论】:

        【解决方案5】:

        在你的类之外可能有另一个同名的函数。 self 是对对象本身的对象引用,因此它们是相同的。 Python 方法不会在对象本身的上下文中调用。 Python中的self可以用来处理自定义对象模型什么的。

        【讨论】:

          【解决方案6】:

          一个原因是引用该特定类实例的方法,代码在其中执行。

          这个例子可能会有所帮助:

          def hello():
              print "global hello"
          
          class bla:
              def hello(self):
                  self.thing()
                  hello()
          
              def thing(self):
                  print "hello"
          
          b = bla()
          b.hello()
          >>> hello
          global hello
          

          您现在可以将其视为命名空间解析。

          【讨论】:

          • 我怎样才能将self传递给b.hello()原因b.hello(self=)不确定self=的值是什么
          猜你喜欢
          • 2013-11-08
          • 1970-01-01
          • 2023-03-07
          • 2022-10-12
          • 2020-12-16
          • 2016-04-23
          • 2020-06-16
          • 1970-01-01
          • 2017-12-15
          相关资源
          最近更新 更多