【问题标题】:What is the type of function inside a class by default if no args are passed?如果没有传递参数,默认情况下类中的函数类型是什么?
【发布时间】:2021-09-09 15:16:02
【问题描述】:
class A:
    @classmethod
    def a(x):
        print('a')

    @staticmethod
    def b():
        print('b')

    def c():
        print('c')

    def d(self): #instance method
        print(self)

A.a() # calling using class

A.b() # calling using class
A().b() # calling using instance

A.c() # calling using class

A().d() # calling using the object

A().c() # calling using instance but returning error

我创建了一个简单的类和不同的方法,这里方法 c( ) 的类型是什么?它不是静态的,就好像它是静态方法一样,它也可以被实例调用,但在这种情况下它会返回错误,它也不是类方法,就好像它是,我们应该在定义函数,那么这里的方法c()是什么类型的呢?

【问题讨论】:

  • 在我看来,@staticmethod 装饰器更多的是为了可读性而不是功能。无论有没有装饰器,该方法都应该按预期工作。但是,最好的做法是确保添加装饰器。
  • 没有兄弟,装饰器不仅仅是为了可读性,它还指定了方法类型,因此函数按指定工作,我试验了几个案例,可以确认这一点。谢谢你的意见顺便说一句,有一个美好的一天。

标签: python-3.x oop


【解决方案1】:

如果您也想在实例上调用该方法,则需要在 Python 3 中使用 @staticmethod。如果不使用装饰器,方法总是将实例作为第一个参数传递,从而导致 TypeError。

这是一个例子:

>>> class A:
>>>     def f():
>>>         print('hello')

>>> A.f()
hello
>>> A().f()
TypeError: f() takes 0 positional arguments but 1 was given
>>> class A:
>>>     @staticmethod
>>>     def f():
>>>         print('hello')

>>> A.f()
hello
>>> A().f()
hello

Python 3中,定义在类内的函数和定义在类外的函数没有区别。这两个都是正常的功能。

self 参数(或者cls)只有在您通过实例访问函数时才会出现。因此,如果您不使用实例,您不会收到任何错误。

【讨论】:

  • 感谢您抽出宝贵的时间回答我的问题,顺便说一句,您能解释一下 A.f( ) 和 A( ).f( ) 之间的区别是什么 A() 不是构造函数吗?非常感谢:D
  • 是的,它是构造函数。我的示例只是想向您展示,使用第一种方法您不能使用实例(即使用构造函数创建的对象)调用函数。即,您不能这样做a = A(); a.f()。您只能使用类名调用该函数,即使用A.f()。相反,如果您使用@statimethod,您可以同时使用这两种方法。如果您认为我的回答有用,请点赞并将其标记为已接受
  • 当然,我可以得出结论,python 在方法调用方式上动态声明了静态/类方法之类的函数类型,就像在运行时声明变量一样?
  • 因此,如果我们只使用类调用一个方法而不传递任何参数,默认情况下它的静态方法,如果我们使用装饰器@classmethod并在方法定义中接受一个arg,它就是类方法并调用方法使用对象是实例方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多