zoukankan      html  css  js  c++  java
  • Python中classmethod和staticmethod的区别

    学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用。

    staticmethod:静态方法

    classmethod:类方法

    在python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

    @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
    普通对象方法至少需要一个self参数,代表类对象实例
    类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
    静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少。

    1.一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法

    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

    这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

    2.既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

    从它们的使用上来看,

    • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
    • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

    如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名

    而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

     1 # -*- coding=utf-8 -*-
     2 # @Time    : 2019/12/02 19:51 加班学习
     3 # @Software: PyCharm
     4 # @Author Jacky
     5 
     6 class Foo(object):
     7 
     8     # 实例方法,第一个参数必须是实例对象。一般习惯用self。
     9     def instance_method(self):
    10         print("是类{}的实例方法,只能被实例对象调用".format(Foo))
    11 
    12     # 类方法, 第一个参数必须是类 对象。一般习惯使用cls。使用@classmethod装饰器装饰。
    13 
    14     @classmethod
    15     def class_method(cls):
    16         print("是类方法")
    17 
    18 
    19     # 静态方法,参数没有要求,和类没有绑定关系,就是一个普通的方法            使用@staticmethod装饰器装饰。
    20     @staticmethod
    21     def static_method():
    22         print("是静态方法")
    23 
    24 
    25 foo = Foo()
    26 
    27 
    28 # 实例方法只能被实例调用
    29 foo.instance_method()
    30 print('==========')
    31 
    32 # 类方法可以被类或者实例调用。
    33 Foo.class_method()
    34 foo.class_method()
    35 
    36 print('----------')
    37 
    38 # 静态方法可以被类或者实例调用。
    39 Foo.static_method()
    40 foo.static_method()
    41 
    42 
    43 '''
    44 是类<class '__main__.Foo'>的实例方法,只能被实例对象调用
    45 ==========
    46 是类方法
    47 是类方法
    48 ----------
    49 是静态方法
    50 是静态方法
    51 '''
    View Code

    小结:

    理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。

  • 相关阅读:
    步步为营 C# 技术漫谈 一、反射机制
    Windows API、CRT和STL
    MVC3 基本业务开发框架
    .NET实现之(WebBrowser数据采集—终结篇)
    步步为营 C# 技术漫谈 二、ASP.NET 页生命周期
    步步为营 .NET 代码重构学习笔记 十
    步步为营 .NET 代码重构学习笔记 十三
    MagicDict开发总结6 [划词 检索]
    步步为营 .NET 代码重构学习笔记系列总结
    项目多少是可以配置的?
  • 原文地址:https://www.cnblogs.com/pythonbetter/p/11972913.html
Copyright © 2011-2022 走看看