Python类的组成主要包含两个部分,类的属性和类的方法。类的属性是对数据的封装,这些数据是用来描述类所抽象的事物的特征;类的方法是用来表示对象的特定行为。Python的类的方法又可以进一步细分为三种不同类型,即实例方法、类方法和静态方法。

这里就是对类的这三种方法进行详细讨论,包括它们是如何实现、如何被调用以及各自的特点。

实例方法

实例方法是你在Python中将会在大多数情况下使用到的最基本、最简单的方法,该方法必须接受一个参数,一般情况下我们将这个参数约定写成self,self参数传入的是类的实例化对象。

实例方法的使用:

定义了一个student类,student类中实现了一个名为get_info实例方法,在get_info实例方法中打印出对象相关信息。class student(object):

def __init__(self, _name, _age):

self.name = _name

self.age  = _age

def get_info(self):

print('%s is %d years old !' %(self.name, self.age))

if __name__ == '__main__':

s = student('LiMing', 12)

s.get_info()

s是使用student类实例化的对象,类的实例方法通过 s.get_info() 方式被调用。在调用实例方法时,s实例对象会被自动的作为参数传给get_info中的第一个self参数中,self也就代表s对象。

可以看出,通过self参数,实例方法可以自由地访问同一对象上的属性和其他方法。当涉及到修改对象的状态时,实例方法就非常给力。

类方法

类方法在Python中使用的比较少,类方法不接受self参数,而是接受一个cls参数,cls参数调用时指向的是类而不是实例对象。通常情况下,类方法使用@classmethod装饰器来修饰。与实例方法不同的是,类方法可以通过类直接调用,也可以通过实例对象直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身。

(注意cls参数和实例方法self参数一样也是约定写成的,可以使用其它名字代替)

类方法的使用:

使用类方法增加前面定义的student类的功能,让每个student类的对象可以得到当前实例化student对象的个数。class student(object):

total_num = 0    def __init__(self, _name, _age):

self.name = _name

self.age  = _age        def __new__(cls, *args, **kwargs):

cls.set_num()return object.__new__(cls)

@classmethoddef set_num(cls):

cls.total_num += 1

@classmethoddef get_num(cls):return cls.total_num        def get_info(self):print('%s is %d years old !' %(self.name, self.age))if __name__ == "__main__":

a = student('a', 10)

print(a.get_num())

b = student('b', 10)print(b.get_num())

新的student类中引入的类属性total_num,重写了__new__方法,使得在每次创建一个实例对象时能调用类方法set_num让类属性total_num加一,total_num代表当前实例化student个数。set_num和get_num都是类方法,它只能访问到类属性。

(类属性和实例属性有所不同,不管创建了多少类对象,他们的类属性只有1个,也就是说类属性属于类而不属于对象。)

类方法实现工厂模式class student(object):    def __init__(self, _name, _age):

self.name = _name

self.age  = _age        def get_info(self):print('%s is %d years old !' %(self.name, self.age))

@classmethoddef factory(cls):return cls('init', 10)

if __name__ == "__main__":

a = student.factory()

b = student.factory()print(a)print(b)

静态方法

静态方法即不接受self参数,也不接受cls参数,但它可以接受其他任意数量的参数。与类方法一样,静态方法也使用一个装饰器修饰,修饰符为@staticmethod。

由于静态方法不接受self参数和cls参数,静态方法不能修改对象状态和类状态。因此,静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

静态方法的使用:class student(object):    def __init__(self, _name, _age):

self.name = _name

self.age  = _age        def get_info(self):print('%s is %d years old !' %(self.name, self.age))

@staticmethoddef do_something(string):print(string)

if __name__ == "__main__":

a = student('a', 10)

a.do_something('staticmethod')

静态方法的调用方式和类实例方法的调用方式一样,只是在调用时Python解释器不会将实例对象强制绑定在静态方法的第一个参数上。a.do_something('staticmethod')即静态方法的调用, ‘staticmethod’表示传给静态方法的参数。

小结实例方法需要实例对象调用,通过self参数访问到该实例。实例方法可以用来修改实例化对象的状态信息。

类方法不能访问到类的实例对象状态,但它可以访问类的属性。类方法可以使用类调用,也可以使用实例直接调用,但传入的类方法左侧的参数是类本身。

静态方法无权访问到self和cls,可以看成是一个独立的、单纯的函数,但它属于类的名称空间中。

python通过对象不能调用类方法和静态方法_Python实例方法、类方法和静态方法相关推荐

  1. python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

  2. python创建实例会调用哪些魔术方法_Python最会变魔术的魔术方法,我觉得是它!...

    作者:豌豆花下猫 来源:Python猫 在,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了 ...

  3. python函数只有被调用才会执行_Python函数调用

    转载自链接: http://www.cnblogs.com/feixuelove1009/p/5541632.html 1.python函数基础 函数名: fun 函数体:1~3行 返回值:2 调用函 ...

  4. python函数只有被调用才会执行_Python函数

    1.函数的定义 python内置了很多函数,可以直接调用,多数情况下,还需要自定义函数,自定义函数的主体,换行的缩进表示代码属于该函数.定义的函数只有被调用的时候才会执行.函数只有有返回值的情况下才可 ...

  5. python类中方法调用自己类的方法_python 类中方法总结 --- 实例方法、类方法、静态方法...

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  6. python用类名直接调用方法_Python类的实例方法、静态方法、类方法详解,附代码示例...

    实例方法 普通实例方法(instance method),第一个参数需要是self,它表示一个具体的实例本身,只能被实例对象调用,通过self引用的可能是类属性.也有可能是实例属性. 实例方法访问类属 ...

  7. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

  8. python 类可以调用实例变量_Python实例方法、类方法、静态方法区别详解

    1.关于参数的区别 实例方法:定义实例方法是最少有一个形参 ---> 实例对象,通常用 self 类方法:定义类方法的时候最少有一个形参 ---> 类对象,通常用 cls 静态方法:定义静 ...

  9. python实例方法、类方法、静态方法的区别_Python 实例方法、类方法、静态方法的区别与作用...

    Python 实例方法.类方法.静态方法的区别与作用 一.总结 一句话总结: 实例方法:第一个参数必须是实例对象,该参数名一般约定为"self",通过它来传递实例的属性和方法(也可 ...

最新文章

  1. 字符串中子序列出现次数
  2. Linux内核中的进程组及会话
  3. 用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序
  4. 几款极好的 JavaScript 下拉列表插件
  5. Windows 集成 FTP 服务器配置–WS08R2已验证
  6. bzoj 4260: Codechef REBXOR(01字典树)
  7. 如何根据iframe内嵌页面调整iframe高宽续篇
  8. 154.寻找旋转排序数组中的最小值II
  9. x3850x5服务器内存_有图有真相 IBM System x3850 X5拆机秀
  10. VS2010中文版莫名的错误
  11. GSAP动画效果三——3D动画
  12. 如何解决Css属性text-overflow:ellipsis 不起作用(文本溢出显示省略号)
  13. ArcGIS矢量化——半自动矢量化操作
  14. 赢富博易告诉你成功交易者的基本素质
  15. 单片机c语言小车转圈,用51单片机编写的智能小车全程前进的C程序
  16. 请详细解释下小波去噪的原理
  17. python 安装TFLearn模块
  18. 二叉树存储结构及实现
  19. smart gesture安装失败_3ds Max 2014 下载与安装步骤
  20. Win10 360浏览器打不开特定网站网页,选择兼容模式有时可以,不稳定

热门文章

  1. 【Realflow】Emitter - Emitter 节点翻译
  2. 创下多项“首个”的开源玩家 —— VMware 中国研发中心技术总监张海宁
  3. 第八届蓝桥杯-第四题方格分割
  4. ASP.NET用户个性化设置Profile
  5. 十年博导,手下竟无一博士毕业?985高校教授遭网友“疯狂吐槽”!
  6. 广工击败清华,CGTN Sports 是这样说的
  7. 搞笑幽默get技能,调侃,好网站
  8. 掉价最快的手机排行榜_目前降价最厉害的四款手机,每款都是超高性价比,你入手了吗?...
  9. 【转载】Chrome插件在高版本浏览器中安装报错解决
  10. helm v2升级v3版本遇到的疑难杂症