pyhton基础【23】面向对象进阶四
目录
十二.静态方法
十三.类方法
十四.类对象
类对象的概念
类对象的作用
实例对象怎么用类对象
内置函数 - dir
十二.静态方法
概述
默认情况下,类中定义的方法是实例方法,即这个方法有一个默认的形参self,这个self会在方法被调用的时候指向对象。但是有些时候,我们并不需要对象的引用,即self没用,那该怎么处理呢?能不写self吗?
答:可以
静态方法的概念
如果一个方法不写self即不需要实例对象的引用,此时在定义方法的时候可以用@staticmethod对函数进行修饰,被修饰的函数就可以不写self
一句话:被@staticmethod修饰的方法,就是静态方法
class 类名:@staticmethoddef 静态方法名():pass
代码示例
class Calculator:"""计算器类"""def __init__(self):# 定义2个默认值self.num1 = 0self.num2 = 0@staticmethoddef show_menu():"""因为打印菜单功能方法并不需要self指向的对象,所以就考虑使用静态方法"""print("计算机 V2025.07")print("1. 加法")print("2. 减法")print("3. 乘法")print("4. 除法")print("5. 退出")def get_nums(self):self.num1 = int(input("请输入第1个数:"))self.num2 = int(input("请输入第2个数:"))def add(self):print(self.num1 + self.num2)def min(self):print(self.num1 - self.num2)def mul(self):print(self.num1 * self.num2)def div(self):print(self.num1 / self.num2)def run(self):while True:self.show_menu()op = input("请输入要进行的操作:")if op == "1":self.get_nums()self.add()elif op == "2":self.get_nums()self.min()elif op == "3":self.get_nums()self.mul()elif op == "4":self.get_nums()self.div()elif op == "5":break# 创建一个计算器对象
cal = Calculator()
# 调用计算器的运行方法
cal.run()运行效果:
计算机 V2025.07
1. 加法
2. 减法
3. 乘法
4. 除法
5. 退出
请输入要进行的操作:
简单总结
如果不需要用到对象,那么就可以将方法用@staticmethod进行修饰,如此一来此方法就变成了静态方法
十三.类方法
概述
为了更好的对类属性进行操作,Python提供了另外一种方法类方法。
类方法的概念
之前在学习静态方法的时候我们知道可以在方法的名字前面添加@staticmethod此时这个方法就是静态方法
与创建静态方法类似,如果想要让一个方法成为类方法我们只需要在这个方法的前面添加 @classmethod即可,与此同时需要在方法的第一个形参位置添加cls
class 类名:@classmethoddef 类方法名(cls):pass
示例代码
class Tool:tools_num = 0 # 定义一个类属性,用来存储共享的数据def __init__(self, name):self.name = nameTool.tools_num += 1def print_info_1(self):print("工具的总数为:", Tool.tools_num)@classmethoddef print_info_2(cls):print("工具的总数为:", cls.tools_num)tieqiao = Tool("铁锹")
chutou = Tool("锄头")
dianciluo = Tool("电磁炉")tieqiao.print_info_1()
Tool.print_info_2()
tieqiao.print_info_2()运行效果:
工具的总数为: 3
工具的总数为: 3
工具的总数为: 3
简单总结
- 定义类方法时,前面添加@classmethod
- 类方法的第一个形参,一般都叫做cls(当然了叫什么名字可以任意,但一般都用cls)
- 调用类方法的时候,可以用实例对象、类对象调用,但无论用哪种方式调用,类方法中的cls指向类对象
十四.类对象
概述
之前在学习类属性的时候,我们提到过:类属性是可以在多个实例对象之间共享的属性。那么问题来了,类属性到底存在哪里呢?
答:类对象
类对象的概念
之前我们说到通过class定义的就是类(就是一个要创建的商品的模板),通过类名()创建出来的叫做实例对象。其实,定义的类(即用class定义的类)实际上也是一个对象。(试想即使我们把类称之为模板,模板不是空的,也是需要占用内存的)
定义的类其实就是一个对象,为了能够将这个对象与其创建出来的实例对象进行区分,将这个class定义的类叫做类对象
类对象的作用
我们知道实例对象是类 (即类对象)创建出来的,所以类对象对于实例对象而言是共享的,既然是共享的那么就干脆将实例对象都有的而且不变化的内容存储到类对象即可,这样会减少内容的占用。那哪些东西会存储在类对象中呢?
- 类属性
- 所有的方法
对你没有看错,除了熟知的类属性之外,类对象中存储了class定义的所有的方法(无论是魔法方法、实例方法、静态方法 、类方法都在类对象中存储),因为方法(函数)的代码是不变的,变化的仅仅是数据而已。
实例对象怎么用类对象
每个实例对象中都会有一个额外默认的属性__class__,这个属性指向了创建当前对象的模板即类对象,所以当调用实例对象.xxx()时,实际上实例对象.__class__.xxx()
内置函数 - dir
既然我们知道了实例对象中有默认的__class__,那除了它之外还有哪些呢?怎么查看呢?
dir(实例对象)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__','__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__']
这么多以__开始的属性或方法不用现在就研究它们的含义和使用方式,在后期的学习中用到什么我们就研究什么。