【Effective Python】类方法、实例方法、静态方法

Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文。

首先,这三种方法都定义在类中。下面我先简单说一下怎么定义和调用的。(PS:实例对象的权限最大。)

实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

调用:只能由实例对象调用。

类方法

定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

调用:实例对象和类对象都可以调用。

静态方法

定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;

调用:实例对象和类对象都可以调用。

实例方法

简而言之,实例方法就是类的实例能够使用的方法。这里不做过多解释。

类方法

使用装饰器@classmethod。

原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。

如下场景:

假设我有一个学生类和一个班级类,想要实现的功能为:
    执行班级人数增加的操作、获得班级的总人数;
    学生类继承自班级类,每实例化一个学生,班级人数都能增加;
    最后,我想定义一些学生,获得班级中的总人数。

思考:这个问题用类方法做比较合适,为什么?因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。

class ClassTest(object):
    __num = 0

    @classmethod
    def addNum(cls):
        cls.__num += 1

    @classmethod
    def getNum(cls):
        return cls.__num

    # 这里我用到魔术方法__new__,主要是为了在创建实例的时候调用累加方法。
    def __new__(self):
        ClassTest.addNum()
        return super(ClassTest, self).__new__(self)

class Student(ClassTest):
    def __init__(self):
        self.name = ‘‘

a = Student()
b = Student()
print(ClassTest.getNum())

静态方法

使用装饰器@staticmethod。

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

譬如,我想定义一个关于时间操作的类,其中有一个获取当前时间的函数。

import time

class TimeTest(object):
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())

print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)

如上,使用了静态方法(函数),然而方法体中并没使用(也不能使用)类或实例的属性(或方法)。若要获得当前时间的字符串时,并不一定需要实例化对象,此时对于静态方法而言,所在类更像是一种名称空间。

其实,我们也可以在类外面写一个同样的函数来做这些事,但是这样做就打乱了逻辑关系,也会导致以后代码维护困难。

原文地址:https://www.cnblogs.com/yanhuaqiang/p/12209960.html

时间: 2024-11-07 20:24:41

【Effective Python】类方法、实例方法、静态方法的相关文章

python类方法/实例方法/静态方法

类方法:隐式接收第一个参数为类本身的方法,通过类或实例皆可调用,在类方法定义中不能访问实例属性及调用实例方法,可以访问已定义的类属性和调用已定义的类方法,使用@classmethod装饰器进行定义: 1 class Test(object): 2 @classmethod 3 def method(cls,*args,**kw):#此处cls即代表Test类本身 4 pass 实例方法:隐式接收第一个参数为实例本身的方法,只能通过实例进行调用,在实例方法定义中可以访问自身已定义过的实例属性及类属

python类方法和静态方法

C++的静态方法是用static关键字,python j是没用static的. python中实现静态方法和类方法都是依赖于python的修饰器来实现的. class MyClass: def  method(self): print("method") @staticmethod def  staticMethod(): print("static method") @classmethod def classMethod(cls): print("cl

python 类属性 实例属性 类方法 实例方法 静态方法(转载)

本文是转载,纯粹是为了方便后面自己查看,建议还是看原文的:http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html 一.先来谈一下类属性和实例属性 在前面的例子中我们接触到的就是类属性,顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问. class people: name = 'j

python 类方法与静态方法

@classmethod : 类方法 @staticmethod : 静态方法 类方法和静态方法的调用一样,都是通过类就可以直接调用(类名.方法名()). 区别: 类方法,需要传入该类,定义类方法的时候要传一个默认的参数cls.是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法.类方法的第一个参数cls, 静态方法则不用.第一个参数是self,表示该类的一个实例. 原文地址:https://www.cnblogs.com/tingxin/p/12216022.htm

Python类方法、静态方法和实例方法的区别

1 #-*- encoding:utf-8 -*- 2 3 class Date(object): 4 def __init__(self, year, month, day): 5 self.year = year 6 self.month = month 7 self.day = day 8 9 #实例方法 10 def tomorrow(self): 11 self.day +=1 12 13 #静态方法(缺点:需要写入固定的类方法名Date) 14 @staticmethod 15 de

python 实例方法,类方法和静态方法

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

python中实例方法,类方法,静态方法的区别

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

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

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

python的实例方法,类方法和静态方法区别

class foo(object):    def test(self):#这是实例方法        print('object')    @classmethod#这是类方法    def test2(clss):        print('class')    @staticmethod#这是静态方法    def test3():        print('static') #实例方法的访问方式ff=foo()ff.test()#实例方法可以通过实例化类然后实例来调用foo.test