【问题标题】:Can we call a class method without self?我们可以调用没有自我的类方法吗?
【发布时间】:2020-10-01 01:56:09
【问题描述】:
class abc:
    def yo(var):
        a=var
        print(a)
x=abc().yo(5)

输出: 回溯(最近一次通话最后一次):
文件“main.py”,第 5 行,在
x=abc().yo(5)
TypeError: yo() 接受 1 个位置参数,但给出了 2 个

    class abc:
        def yo(self,var):
            self.a=var
            print(self.a)
    x=abc().yo(5)

输出:5

在我使用 self 关键字之前它一直有效我的意思是我们可以在不使用 self 参数的情况下调用一个函数,为什么它说 yo() 接受 1 个参数,而当我们排除 self 时给出 2 个参数?

【问题讨论】:

  • self 不是关键字,它是实例方法的第一个参数的常规名称。如果您不需要访问实例,请不要将其设为实例方法 - 它可以是静态方法或只是一个函数。
  • 如果您的方法不需要self,这表明它应该是静态的stackoverflow.com/questions/43587044/…
  • @jonrsharpe self 不是关键字。我的意思是我们可以就地使用任何其他变量吗?
  • 您在上述评论中的问题已在以下答案之一中得到解答。我只是添加静态方法意味着该方法既不依赖于实例也不依赖于类,这就是为什么它不需要参数列表中的selfcls
  • 它在类中只是因为与它有一些亲和,否则它可能只是另一个正常的功能。

标签: python python-3.x class oop self


【解决方案1】:

你必须使用装饰器来改变你的类方法中的第一个参数,如果你没有放置任何装饰器,函数有默认的 self 参数(使用此方法的实例),如果你放置 @classmethod 装饰器就像下面的第一个参数是 cls (方法的类):

class abc:
    a = 'abc'

    @classmethod
    def aFunction(cls, value)
        print(cls.a + value)

第二个装饰器,可能是您正在寻找的装饰器,它允许您拥有一个没有默认参数的类方法:

class abc:
    def __init__(self,value):
        self.value = value

    @staticmethod
    def aFunction(value):
        return value+'abc'

【讨论】:

  • 谢谢!先生,现在我默认使用self
【解决方案2】:

self实际上是长期以来使用的约定,而不是真正的python关键字。 self 只是函数中的一个参数,您可以轻松地使用另一个参数名称来代替它。

那为什么要使用self 因为它是可取的,因为它增加了代码的可读性。

另外,如果方法不需要self,通常表示它应该是静态方法

【讨论】:

  • 这意味着我不能在不使用 self 的情况下从对象调用方法。
  • 它说静态方法是只为类定义的方法,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多