前言:类和对象是面向对象编程中很重要的概念,可以说是核心思想,网上定义和解析一搜一大堆。这里只记录我个人的粗浅理解。
1)定义
2)表示和示例
① 格式
"""类的表示"""
# 第一种
class Cat(object):
pass
# 第二种
class Cat():
pass
# 第三种
class Cat:
pass
"""方法和属性"""
class Students():
ident = 'student' # 类属性
def __init__(self,name,age):# __init__ 称为构造函数
self.name = name #实例属性,在__init__方法中定义
self.age = age
@classmethod
def leimethod(): # 类方法
pass
@staticmethod
def jingtaimethod() # 静态方法
pass
def method(self): # 实例方法,必须有参数self,表示对象本身
pass
"""初始化一个对象"""
# 格式
类名(参数0,参数1,...)
# 初始化一个类的实例对象,需要传参初始化实例属性
dora = Students(name='Dora',age='20')
"""类继承"""
class Cat(Animal): # 括号中写被继承的类,即父类
pass
② 举个栗子
- 先写个类
class Mobile():
BATTERY = True # 类属性,一般用大写
def __init__(self, brand, model, color='black'):
self.color = color
self.model = model
self.brand = brand
@classmethod
def chongdian(self):
print("这是类方法")
@staticmethod
def add():
print("这是静态方法,和类、对象无关")
def call(self):
"""打电话"""
print(f"{self} 手机正在打电话。")
- 实例化和属性、方法调用
>>> Mobile # 类本身
<class '__main__.Mobile'>
>>> Mobile(brand='Huawei',model='Mate40') # 实例化一个对象
<__main__.Mobile object at 0x000002AAD351AB50>
>>> Mobile() # 如果有实例属性,实例化时必须传参
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
Mobile()
TypeError: __init__() missing 2 required positional arguments: 'brand' and 'model'
>>> Mobile.BATTERY # 类属性可以通过类直接调用
True
>>> huawei_mate40 = Mobile(brand='Huawei',model='Mate40')
>>> huawei_mate40.BATTERY # 类属性也可以通过对象调用
True
>>> Mobile.add() # 静态方法可通过类调用
这是静态方法,和类、对象无关
>>> huawei_mate40.add() # 静态方法可通过对象调用
这是静态方法,和类、对象无关
>>> Mobile.chongdian() # 类方法可以通过类调用
这是类方法
>>> huawei_mate40.chongdian() # 类方法也可以通过对象调用
这是类方法
>>> Mobile.call() # 实例方法不能通过类调用
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
Mobile.call()
TypeError: call() missing 1 required positional argument: 'self'
>>> huawei_mate40.call() # 实例方法只能由对象调用
<__main__.Mobile object at 0x000002AAD351AC10>手机正在打电话。
- 类继承
class Mobile():
BATTERY = True # 类属性,一般用大写
def __init__(self, brand, model):
self.model = model
self.brand = brand
def call(self):
"""打电话"""
print(f"{self} 手机正在打电话。")
class SmartPhone(Mobile): # SmartPhone继承Mobile
def play_game(self):
print("玩游戏。")
iphone = SmartPhone('iphone12', 'apple') # 初始化一个SmartPhone对象
iphone.play_game() # 调用SmartPhone的实例方法
iphone.call() # 调用父类Mobile的实例方法
- 多继承,如果多个父类存在同名方法,调用顺序遵循就近原则,从左到右。下面举例说明
>>> class A:
def amethod(self):
print("这是A的实例方法")
def same(self):
print("同名A")
>>> class B:
def bmethod(self):
print("这是B的实例方法")
def same(self):
print("同名B")
>>> class C(A,B): # C继承2个父类
def cmethod(self):
print("这是C的实例方法")
>>> C().same() # 同名方法,默认调用近的那个
同名A
>>> C.__mro__ # 可通过__mro__查看调用顺序
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
- 重构,其实就是定义子类时重写父类的同名方法
class Mobile():
BATTERY = True # 类属性,一般用大写
def __init__(self, brand, model):
self.model = model
self.brand = brand
def call(self):
"""打电话"""
print(f"{self} 手机正在打电话。")
class SmartPhone(Mobile): # SmartPhone继承Mobile
def call(self): # 重写call方法,直接重构
print("重构call方法")
def play_game(self):
print("玩游戏。")
>>> huawei_mate40 = SmartPhone(model='mate40',brand='huawei')
>>> huawei_mate40.call() # 调用同名方法时使用子类重构的方法
重构call方法
- 超继承,super继承,既想保留父类特性,也想增加子类特性
class Mobile():
BATTERY = True # 类属性,一般用大写
def __init__(self, brand, model):
self.model = model
self.brand = brand
def call(self):
"""打电话"""
print(f"{self} 手机正在打电话。")
class SmartPhone(Mobile):
def __init__(self, brand, model, color='black'):
super().__init__(brand, model) # TODO:注意一下书写格式
self.color = color
def call(self): # 重写call方法,先继承后重构
"""打电话"""
super().call()
print("边打电话边录音")
>>> SmartPhone("huawei","mate40","white").call() # 继承父类,加上子类
<__main__.SmartPhone object at 0x000002AAD3547A00> 手机正在打电话。
边打电话边录音