Python实例方法与类方法和静态方法介绍与区别分析

目录
  • 1.实例方法
  • 2.类方法
  • 3.静态方法
  • 4.实例方法与类方法和静态方法的区别

1.实例方法

Python 的实例方法用得最多,也最常见。我们先来看 Python 的实例方法。

class Kls(object):
    def __init__(self, data):
        self.data = data
    def printd(self):
        print(self.data)
ik1 = Kls('leo')
ik2 = Kls('lee')
ik1.printd()
ik2.printd()

输出:

leo
lee

上述例子中,printd 为一个实例方法。实例方法第一个参数为self,当使用ik1.printd()调用实例方法时,实例ik1会传递给self参数,这样self参数就可以引用当前正在调用实例方法的实例。利用实例方法的这个特性,上述代码正确输出了两个实例的成员数据。

2.类方法

Python 的类方法采用装饰器 @classmethod 来定义,我们直接看例子。

class Kls(object):
    num_inst = 0
    def __init__(self):
        Kls.num_inst = Kls.num_inst + 1
    @classmethod
    def get_no_of_instance(cls):
        return cls.num_inst
ik1 = Kls()
ik2 = Kls()
print (ik1.get_no_of_instance())
print (Kls.get_no_of_instance())

输出

2
2

在上述例子中,我们需要统计类Kls实例的个数,因此定义了一个类变量num_inst来存放实例个数。通过装饰器 @classmethod 的使用,方法 get_no_of_instance 被定义成一个类方法。

在调用类方法时,Python 会将类(class Kls)传递给cls,这样在get_no_of_instance内部就可以引用类变量num_inst。

由于在调用类方法时,只需要将类型本身传递给类方法,因此,既可以通过类也可以通过实例来调用类方法。

注意,实例方法只可以通过实例来调用。

3.静态方法

在开发中,我们常常需要定义一些方法,这些方法跟类有关,但在实现时并不需要引用类或者实例,例如,设置环境变量,修改另一个类的变量,等。这个时候,我们可以使用静态方法。

Python 使用装饰器 @staticmethod 来定义一个静态方法。

IND = 'ON'
class Kls(object):
    def __init__(self, data):
        self.data = data
    @staticmethod
    def checkind():
        return IND == 'ON'
    def do_reset(self):
        if self.checkind():
            print('Reset done for: %s' % self.data)
    def set_db(self):
        if self.checkind():
            print('DB connection made for: %s' % self.data)
ik1 = Kls(24)
ik1.do_reset()
ik1.set_db()

输出:

Reset done for: 24
DB connection made for: 24

在代码中,我们定义了一个全局变量IND,由于IND跟类Kls相关,所以我们将方法checkind放置在类Kls中定义。方法checkind只需检查IND的值,而不需要引用类或者实例,因此,我们将方法checkind定义为静态方法。

对于静态方法,Python 并不需要传递类或者实例,因此,既可以使用类也可以使用实例来调用静态方法。

4.实例方法与类方法和静态方法的区别

我们用代码说明实例方法,类方法,静态方法的区别。注意下述代码中方法foo,class_foo,static_foo的定义以及使用。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Kls(object):
    def foo(self, x):
        print('executing foo(%s,%s)' % (self, x))
    @classmethod
    def class_foo(cls,x):
        print('executing class_foo(%s,%s)' % (cls,x))
    @staticmethod
    def static_foo(x):
        print('executing static_foo(%s)' % x)
ik = Kls()
# 实例方法
ik.foo(1)
print(ik.foo)
print('==========================================')
# 类方法
ik.class_foo(1)
Kls.class_foo(1)
print(ik.class_foo)
print('==========================================')
# 静态方法
ik.static_foo(1)
Kls.static_foo('hi')
print(ik.static_foo)

输出:

executing foo(<__main__.Kls object at 0x0551E190>,1)
<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
==========================================
executing class_foo(<class '__main__.Kls'>,1)
executing class_foo(<class '__main__.Kls'>,1)
<bound method type.class_foo of <class '__main__.Kls'>>
==========================================
executing static_foo(1)
executing static_foo(hi)
<function static_foo at 0x055238B0>

对于实例方法,调用时会把实例ik作为第一个参数传递给self参数。因此,调用ik.foo(1)时输出了实例ik的地址。

对于类方法,调用时会把类Kls作为第一个参数传递给cls参数。因此,调用ik.class_foo(1)时输出了Kls类型信息。

前面提到,可以通过类也可以通过实例来调用类方法,在上述代码中,我们再一次进行了验证。

对于静态方法,调用时并不需要传递类或者实例。其实,静态方法很像我们在类外定义的函数,只不过静态方法可以通过类或者实例来调用而已。

值得注意的是,在上述例子中,foo只是个函数,但当调用ik.foo的时候我们得到的是一个已经跟实例ik绑定的函数。调用foo时需要两个参数,但调用ik.foo时只需要一个参数。foo跟ik进行了绑定,因此,当我们打印ik.foo时,会看到以下输出:

<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>

当调用ik.class_foo时,由于class_foo是类方法,因此,class_foo跟Kls进行了绑定(而不是跟ik绑定)。当我们打印ik.class_foo时,输出:

<bound method type.class_foo of <class '__main__.Kls'>>

当调用ik.static_foo时,静态方法并不会与类或者实例绑定,因此,打印ik.static_foo(或者Kls.static_foo)时输出:

<function static_foo at 0x055238B0>

概括来说,是否与类或者实例进行绑定,这就是实例方法,类方法,静态方法的区别。

到此这篇关于Python实例方法与类方法和静态方法介绍与区别分析的文章就介绍到这了,更多相关Python实例方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python根据输入参数计算结果的实例方法

    说明 define function,calculate the input parameters and return the result. 数据存放在 txt 里,为 10 行 10 列的矩阵. 编写一个函数,传入参数:文件路径.第一个数据行列索引.第二个数据行列索引和运算符. 返回计算结果 如果没有传入文件路径,随机生成 10*10 的值的范围在 [6, 66] 之间的随机整数数组存入 txt 以供后续读取数据和测试. 1.导入需要的依赖库和日志输出配置 # -*- coding: UT

  • python对网页文本的格式化实例方法

    1.一个网页通常包含文本信息.对于不同的文本类型,我们可以选择合适的HTML语义元素进行标记. 2.em元素用于标记和强调部分内容,small元素用于注释和署名文本. 实例 <body> <h1>论语学而篇第一</h1> <p><small> <b>作者:</b><abbr title="名丘,字仲尼">孔子<sup><a href="#" rel=&q

  • python实例方法的使用注意及代码实例

    1.实例方法是从属于实例对象的方法,定义实例方法时,第一个参数必须为 self.self 指当前的实例对象. 2.调用实例方法是,不需要也不能给 self 传值,self 由解释器自动传参. 实例 class getMin(): # 实例方法 def fun(self, arr, n): print(arr[n-1]) # 类方法 @classmethod def class_fun(cls): print("this is class function") if __name__ =

  • python建立web服务的实例方法

    1.说明 (1)有时候我们需要一种简单快捷的方法来建立RPC服务.只需让程序B调用程序A. (2)不需要知道任何关于这一点的技术,但我们只需要这么简单的东西.我们可以使用一个协议(相应的Python库实现SimpleXMLRPCServer)来处理这种事情. 2.实例 from SimpleXMLRPCServer import SimpleXMLRPCServer def file_reader(file_name): with open(file_name, 'r') as f: retur

  • python TKinter弹出式菜单的实例方法

    1.弹出菜单也叫上下文菜单,建立菜单并向菜单添加各种功能. 2.右键监听鼠标.如右键点击,则根据位置判断弹出. 3.调用Menupop方法. 4.add_separator添加分隔符. 实例 # 弹出式菜单案例 import tkinter def makeLabel(): global baseFrame tkinter.Label(baseFrame, text="PHP是最好的编程语言,我用Python").pack() baseFrame = tkinter.Tk() menu

  • Python实例方法与类方法和静态方法介绍与区别分析

    目录 1.实例方法 2.类方法 3.静态方法 4.实例方法与类方法和静态方法的区别 1.实例方法 Python 的实例方法用得最多,也最常见.我们先来看 Python 的实例方法. class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) ik1 = Kls('leo') ik2 = Kls('lee') ik1.printd() ik2.printd() 输出

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

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

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

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

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

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

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

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

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

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

  • Python 类方法和静态方法之间的区别

    目录 前言 1. 实例方法 instance method 2. 类方法 class method 3. 静态方法 static method 前言 类中不仅可以有 methods,还可以有变量,这些变量称为类属性,例如如下代码中 Book 类的 TYPES 即为类属性. 类中的方法分为3类: 1. 实例方法 instance method 不使用装饰器类中的所有方法,如果第一个参数是 self,就是 instance method, self 是创建的类实例,实例方法与实例即对象相关.(sel

  • python的类方法和静态方法

    本文实例讲述了python的类方法和静态方法.分享给大家供大家参考.具体分析如下: python没有和C++中static关键字,它的静态方法是怎样的呢?还有其它语言中少有的类方法又是神马? python中实现静态方法和类方法都是依赖于python的修饰器来实现的. 复制代码 代码如下: class MyClass:       def  method(self):            print("method")       @staticmethod     def  stat

  • 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-类属性,实例属性,类方法,静态方法,实例方法 类属性和实例属性 #coding:utf-8 class Student(object): name = 'I am a class variable' #类变量 >>> s = Student() # 创建实例s >>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性 Student >>> print(Student.n

随机推荐