翼度科技»论坛 编程开发 python 查看内容

类方法和对象方法

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
6.4 类方法和对象方法

方法的本质其实就是函数,在模块中定义就是函数,在类中定义就是类的方法。方法按照归属分类一般有3种:对象方法、类方法、静态方法。
6.4.1 对象方法
  1. class Person:
  2.     cls_attr = '我是类属性'
  3.     def __init__(self):
  4.         self.obj_attr = '我是对象属性'
  5.     def eat(self):
  6.         print('我在吃饭,别烦我。')
  7. zhangsan = Person()
  8. zhangsan.eat()
复制代码
我在吃饭,别烦我。
在上面的代码中:
我们在用def eat(self):定义了一个函数,而这个函数是在类中定义的,则称为这个类的方法。这个方法内部只有一条命令:print('我在吃饭,别烦我。')。
之前我们已经学会了如何定义一个函数,实际上类中的方法其实就是一个函数,只不过:
1、方法在类的内部定义
2、方法的第一个形参必须要有,通常为self,代表的就是类实例化后的那个对象本身。
3、方法的调用为:对象.方法(参数),在调用时,开发者不需要再手动传入一个实参给前面说的self形参,这个行为是在实例化后自动实现的。而函数的调用方法为:函数名(参数)。
zhangsan.eat():这句代码是执行了zhangsan对象中的eat方法,结果就是执行了定义时的语句:print('我在吃饭,别烦我。')
6.4.2 类方法

如果在定义对象方法前面添加@classmethod的装饰器后,该方法就从对象方法变成了类方法。如下:
  1. class Person:
  2.     def __init__(self):
  3.         self.name = '张三'
  4.     @classmethod
  5.     def eat(cls):
  6.         print('我在吃饭,别烦我。')
  7. zhangsan = Person()
  8. zhangsan.eat()
  9. Person.eat()
复制代码
我在吃饭,别烦我。
我在吃饭,别烦我。
类方法的第一个参数同对象方法一样,调用时不需要传入,通常形参写成cls。类方法可以通过类名或者实例化后的对象调用。
6.4.3 静态方法

静态方法则是在定义方法时添加了@staticmethod装饰器的方法。
  1. class Person:
  2.     def __init__(self):
  3.         self.name = '张三'
  4.     @staticmethod
  5.     def eat():
  6.         print('我在吃饭,别烦我。')
  7. zhangsan = Person()
  8. zhangsan.eat()
复制代码
我在吃饭,别烦我。
定义静态方法时,不需要再传入self、cls等特殊的形参,而可以像其它函数一样使用参数定义。实际上,静态方法已经完全就是一个普通函数了。
6.4.4 私有方法

如果在类中定义了以__开头的方法名,表示该方法是一个私有方法,在类的外部是不可以直接访问的。当然,和私有属性一样,还是可以通过_类名方法名进行访问的。而以_开头的方法名也是一样,可以直接在外部访问,但是不建议使用。
  1. class MyClass2:
  2.     def _fun1(self):
  3.         print('fun1')
  4.     def __fun2(self):
  5.         print('fun2')
  6. mc = MyClass2()
  7. mc._fun1()
  8. mc._MyClass2__fun2()
  9. mc.__fun2()
复制代码
fun1
fun2
Traceback (most recent call last):
File "E:\BaiduNetdiskWorkspace\FrbPythonFiles\study\main.py", line 13, in
mc.__fun2()
AttributeError: 'MyClass2' object has no attribute '__fun2'
6.4.5 对象方法、类方法、静态方法的区别

参数区别:
对象方法:
第一个形参必须是指向对象本身,通常为self,调用时不需要传入对应实参。
类方法:
第一个形参必须是指向类本身,通常为cls,调用时不需要传入对应实参。
静态方法:
形参定义同普通函数一样。
调用属性区别:
对象方法:
可以通过self.的方式(和第一形参对应)调用对象属性,但是不能调用类属性。
类方法:
可以通过cls.的方式(和第一形参对应)调用类属性,但是不能调用对象属性。
静态方法:
不能调用类属性和对象属性。
调用区别:
对象方法:
对象可以直接调用;类也可以调用,前提是对象方法中没有调用对象属性。
类方法:
对象和类都可以调用。无论类方法中有没有调用类属性。
静态方法:
对象和类都可以调用。但是在调用时,静态方法中无法调用对象或类属性。
总结性代码如下,其中会报错的代码就注释掉了:
  1. class Person:
  2.     cls_attr = '我是类属性'
  3.     def __init__(self):
  4.         self.obj_attr = '我是对象属性'
  5.     def eat(self):
  6.         # print(cls_attr)
  7.         print(self.obj_attr)
  8.     @classmethod
  9.     def sleep(cls):
  10.         print(cls.cls_attr)
  11.         # print(self.obj_attr)
  12.     @staticmethod
  13.     def run():
  14.         # print(cls_attr)
  15.         # print(self.obj_attr)
  16.         print('我是静态方法')
  17. zhangsan = Person()
  18. zhangsan.eat()
  19. zhangsan.sleep()
  20. zhangsan.run()
  21. # Person.eat()
  22. Person.sleep()
  23. Person.run()
复制代码
我是对象属性
我是类属性
我是静态方法
我是类属性
我是静态方法

来源:https://www.cnblogs.com/sibide/p/17154499.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具