• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python面向对象方法的区别

python 搞代码 4年前 (2022-01-09) 10次浏览 已收录 0个评论

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

实例方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;

类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;

静态方法:由类调用;无默认参数。

实例方法

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参数就可以引用当前正在调用实例方法的实例。利用实例方法的这个特性,上述代码正确输出了两个实例的成员数据。

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

类方法

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_instik1 = Kls()ik2 = Kls()print ik1.get_no_of_instance()print Kls.get_no_of_instance()

输出:

2 2

在上述例子中,我们需要统计类Kls实例的个数,因此定义了一个类变量num_inst来存放实例个数。通过装饰器@classmeth来2源gaodaima#com搞(代@码&网od的使用,方法get_no_of_instance被定义成一个类方法。在调用类方法时,Python 会将类(class Kls)传递给cls,这样在get_no_of_instance内部就可以引用类变量num_inst。

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

静态方法

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

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 并不需要传递类或者实例,因此,既可以使用类也可以使用实例来调用静态方法。

实例方法,类方法与静态方法的区别

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

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)

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python面向对象方法的区别

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址