浅谈python 类方法/静态方法

1.类方法

类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:

@classmethod
def 类方法名(cls [, 形参列表]):
	方法体

要点如下:

  1. @classmethod必须位于方法的上面一行
  2. 第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
  3. 调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
  4. 类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
  5. 子类继承父类方法时,传入cls是自身对象,而非父类对象。(后面的笔记会有介绍)

代码示例:

class Student:
  count = 0    # 类属性

  """定义方法"""
  @classmethod
  def print_count(cls):
    """cls参数代表类对象"""
    print(Student.count)

"""调用类方法"""
print("调用时,不传递cls参数")
Student.print_count()

运行结果:

调用时,不传递cls参数
0

2.静态方法

在python中,允许定义于”类对象“无关的方法,称为"静态方法"。
"静态方法"和在模块中定义的普通方法没有什么区别,只不过"静态方法"放到了"类的名字变量空间",需要通过类调用。
静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):
	方法体

要点如下:

  1. @staticmethod必须位于方法上面一行
  2. 调用静态方法格式:类名.静态方法名(参数列表)
  3. 静态方法中访问实例属性和实例方法会导致错误

代码示例:

class Student:
  count = 0      # 类属性

  @staticmethod
  def add(a, b):
    """与类无关的静态方法"""
    """因为静态方法从属于类,所以是可以操作类属性和类方法"""
    print("{0}+{1}={2}".format(a, b, a+b))
    return a + b

# 调用静态方法
Student.add(20, 30)

运行结果:

20+30=50
res=50

3.实例方法/类方法/静态方法的区别

class MyClass:
  # 类属性
  class_attr = 0

  def __init__(self, obj_attr):
    self.obj_attr = obj_attr

  def instance_method(self):
    return "instance method called", self

  @classmethod
  def class_method(cls):
    return "class method called", cls

  @staticmethod
  def static_method():
    return "static method called"

print("调用实例方法")
obj1 = MyClass("obj_attr1")
print(obj1.instance_method())

print("--" * 20)
print("调用类方法")
print(MyClass.class_method())

print("--" * 20)
print("调用静态方法")
print(MyClass.static_method())

运行结果:

调用实例方法
('instance method called', <__main__.MyClass object at 0x10ca93310>)
----------------------------------------
调用类方法
('class method called', <class '__main__.MyClass'>)
----------------------------------------
调用静态方法
static method called

注意: 以下讨论的属性、方法均指公开的类型,非私有的。

实例方法:

  1. 能读取、修改实例属性
  2. 能调用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数

类方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:类名.类方法名(参数列表),编译器自动传递cls参数

静态方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式: 类名.静态方法名(参数列表),不需要cls参数
  7. 类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。

以上就是浅谈python 类方法/静态方法的详细内容,更多关于类方法/静态方法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深入解析python中的实例方法、类方法和静态方法

    1.实例方法/对象方法 实例方法或者叫对象方法,指的是我们在类中定义的普通方法. 只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身 2.静态方法 (1).格式:在方法上面添加 @staticmethod (2).参数:静态方法可以有参数也可以无参数 (3).应用场景:一般用于和类对象以及实例对象无关的代码. (4).使用方式: 类名.类方法名(或者对象名.类方法名). 定义一个静态方法 class Game: @staticmethod def menu(): prin

  • Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    本文实例讲述了Python 类方法和实例方法(@classmethod),静态方法(@staticmethod).分享给大家供大家参考,具体如下: demo.py(类方法,@classmethod): class Tool(object): # 使用赋值语句定义类属性,记录所有实例化工具对象的数量 count = 0 # @classmethod 定义类方法. 第一个参数是cls (cls用于访问类属性和类方法,不能访问实例属性/方法) @classmethod def show_tool_co

  • Python3.0中普通方法、类方法和静态方法的比较

    一.语法区别 刚接触Python中的面向对象,对于类方法和静态方法难以区分,通过查找知乎.CSDN论坛,废了好大的劲思路才逐渐明朗,所以就总结顺便分享一下. 首先开始编辑代码 # 普通方法.类方法.静态方法的比较 # 普通方法.类方法.静态方法的比较 class Test: # 定义类Test的属性 name = 'python' content = '人生苦短,我用python!' def normal_method(self): # 普通方法访问类Text的属性 print(self.con

  • 浅谈python中的实例方法、类方法和静态方法

    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法,self一般是在实例方法中使用,而cls则一般在类方法中使用,在静态方法中则不需要使用一个默认参数.在下面的代码中,InstanceMethod类的方法中,第一个参数是默认的self,在这里可以把self换成任何名字来表示,不会有任何影响.在类调用的时候,需要满足参数的个数要求(参数中含有*args

  • Python实例方法、类方法、静态方法的区别与作用详解

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义和调用的.(PS:实例对象的权限最大.) 实例方法 定义:第一个参数必须是实例对象,该参数名一般约定为"self",通过它来传递实例的属性和方法(也可以传类的属性和方法): 调用:只能由实例

  • Python 面向对象静态方法、类方法、属性方法知识点小结

    本文实例讲述了Python 面向对象静态方法.类方法.属性方法知识点.分享给大家供大家参考,具体如下: (1)静态方法-->-@staticmethod装饰类中方法 只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性 class Dog(object): def __init__(self,name): self.name = name @staticmethod #实际上跟类没什么关系了 def eat(self): print("%s is eating %s&quo

  • 解析python 类方法、对象方法、静态方法

    python中实现静态方法和类方法都是依赖于python的修饰器来实现的. 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的. 1.我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person: grade=1 def __init__(self,name): self.name =

  • Python 静态方法和类方法实例分析

    本文实例讲述了Python 静态方法和类方法.分享给大家供大家参考,具体如下: 1. 类属性.实例属性 它们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 实例属性属于对象 类属性属于类 class Province(object): # 类属性 country = '中国' def __init__(self, name): # 实例属性 self.name = name # 创建一个实例对象 obj = Province('山东省') # 直接访问实例属性 print(obj

  • 深入了解Python 方法之类方法 & 静态方法

    写在之前 这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过. 昨天的文章 详解类方法之绑定方法与非绑定方法 中写了方法中的绑定方法和非绑定方法,今天我们继续来学习剩下的「类方法」和「静态方法」. 类方法 & 静态方法 在开始之前,先让我们来看下面一段代码: class Sample: language = "C++" def __init__(self): self.language = "p

  • Python面向对象之静态属性、类方法与静态方法分析

    本文实例讲述了Python面向对象之静态属性.类方法与静态方法.分享给大家供大家参考,具体如下: 1. 静态属性:在函数前加@property,将函数逻辑"封装"成数据属性,外部直接调用函数名,如同调用属性一样.这个函数是可以调用对象和类的属性的. # -*- coding:utf-8 -*- class Room: def __init__(self,name,owner,width,length): self.name = name self.owner = owner self.

  • Python 实例方法、类方法、静态方法的区别与作用

    Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义和调用的.(PS:实例对象的权限最大.) 实例方法 定义:第一个参数必须是实例对象,该参数名一般约定为"self",通过它来传递实例的属性和方法(也可以传类的属性和方法): 调用:只能由实例对象调用. 类方法 定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一

  • Python实例方法、类方法、静态方法区别详解

    1.关于参数的区别 实例方法:定义实例方法是最少有一个形参 ---> 实例对象,通常用 self 类方法:定义类方法的时候最少有一个形参 ---> 类对象,通常用 cls 静态方法:定义静态方法的时候可以不定义形参 2.关于方法定义时候添加装饰器的区别 实例方法:不需要添加装饰器 类方法:需要添加装饰器 ----> @classmethod 静态方法:需要添加装饰器 ---> @staticmethod 3.调用: 1.实例方法可以通过对象直接调用 2.但是用类名调用的时候,需要创

随机推荐