教程集 www.jiaochengji.com
教程集 >  Python编程  >  Python入门  >  正文 Python之classmethod和staticmethod的区别

Python之classmethod和staticmethod的区别

发布时间:2021-12-16   编辑:jiaochengji.com
教程集为您提供Python之classmethod和staticmethod的区别等资源,欢迎您收藏本站,我们将为您提供最新的Python之classmethod和staticmethod的区别资源

python中3种方式定义类方法,常规方式、@classmethod修饰方式、@staticmethod修饰方式。

<pre class="brush:php;toolbar:false">class A(object):     def foo(self, x):         print('调用foo函数 (%s, %s)'%(self, x))         print('self:', self)     @classmethod     def class_foo(cls, x):         print('调用class_foo函数 (%s, %s)' % (cls, x))         print('cls:', cls)     @staticmethod     def static_foo(x):         print('调用static_foo函数 (%s)' % (x)) a = A()</pre>

1. 定义方式

普通foo()函数需要self参数隐式的传递当前类对象的实例。@classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。

self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通过self来传递当前类对象的实例,cls传递当前类对象。

2. 绑定对象

<pre class="brush:php;toolbar:false">foo方法绑定对象A的实例 print(a.foo) <bound method A.foo of <__main__.A object at 0x100721cf8>> class_foo方法绑定对象A print(a.class_foo) <bound method A.class_foo of <class '__main__.A'>> static_foo没有参数绑定。 print(a.static_foo) <function A.static_foo at 0x100727730></pre>

相关推荐:《Python视频教程》

3. 调用的方式

foo可通过实例a调用,类对象A直接调用会参数错误。

<pre class="brush:php;toolbar:false">print(a.foo(1)) 调用foo函数 (<__main__.A object at 0x10245ccf8>, 1) self: <__main__.A object at 0x10245ccf8> print(A.foo(1)) Traceback (most recent call last):   File "/Users/liuhuiling/Desktop/MT_code/OPUnittest/case/demo.py", line 63, in <module>     print(A.foo(1)) TypeError: foo() missing 1 required positional argument: 'x'</pre>

class_foo可通过类对象A 或对象实例a调用。

<pre class="brush:php;toolbar:false">a.class_foo(2) A.class_foo(2) 调用class_foo函数 (<class '__main__.A'>, 2) cls: <class '__main__.A'></pre>

static_foo可通过类对象A 或对象实例a调用。

<pre class="brush:php;toolbar:false">a = A() a.static_foo(3) A.static_foo(3) 调用static_foo函数 (3)</pre>

4. 继承与覆盖普通类函数一样。

<pre class="brush:php;toolbar:false">class C(A):     pass c = C() c.foo(1) c.class_foo(1) c.static_foo(1)</pre>

运行结果:

<pre class="brush:php;toolbar:false">调用foo函数 (<__main__.B object at 0x10246a2b0>, 1) self: <__main__.B object at 0x10246a2b0> 调用class_foo函数 (<class '__main__.B'>, 1) cls: <class '__main__.B'> 调用static_foo函数 (1)</pre>

您可能感兴趣的文章:
Python之classmethod和staticmethod的区别
Python静态方法和类方法的区别和应用
python3类中的装饰方法如何选择?
python静态方法和类方法的区别有哪些
Python的类方法和静态方法是什么
python 成员方法的区别是什么
python 装饰器详解
python类中怎么定义方法
python3类方法和静态方法如何选择?哪个好?
python的类有几种方法

[关闭]
~ ~