13.面向对象
大约 4 分钟学习笔记Python基础
一、 类
Python 中 一切对象都有各自的类。
Python 中,除了内置的类之外,我们也可以自定义类。
- 使用 - class关键字 定义一个类。- class BenzCar: brand = '奔驰' # 品牌属性 country = '德国' # 产地属性 @staticmethod def pressHorn(): print('嘟嘟~~~~~~')
- 类 和 变量 的 命名规则一样,类名的 首字母大写 。 
- brand 和 country 都是这个类的 - 属性,也叫- 类属性- 类属性 的调用: - print(BenzCar.brand)
 
- pressHorn 是类的方法 ,也叫 - 类方法- @staticmethod则表示 该方法是这个类的- 静态方法
- 静态方法 的调用: - BenzCar.pressHorn()
 
二、 实例
1. 类和实例的关系
某种对象的类型 称为 类 ,他描述了这个类型的实例的 公共特征。
具体 的对象 称为 实例 。
- 实例的产生(在类名后面加上 - ()):- car1 = BenzCar()- car1 变量就对应一个 BenzCar 类型 的实例对象,具有 BenzCar 类 的一切属性和方法。
 
2. 实例属性
类里面的属性都是 类属性 , 里面的方法都是 静态方法 。
- 实例属性 :每个实例独有的属性。 
- 实例属性 通常定义在类的 初始化方法 - __init__里面。- 解释器在创建好实例后,会立即执行 __init__方法 。
- 调用 __init__方法时,就将实例对象 传递给 self 参数。
- self 参数变量 指向的 就是 实例对象 本身 。
 - class BenzCar: brand = '奔驰' country = '德国' @staticmethod def pressHorn(): print('嘟嘟~~~~~~') # 初始化方法, 注意前后各有两个下划线 def __init__(self): self.color = 'red' # 颜色 self.engineSN = '837873398' # 发动机编号
- 解释器在创建好实例后,会立即执行 
- 类的静态方法在定义是,需要加上 - @staticmethod的修饰- 类的 实例方法 不需要任何修饰
 
- 通常 类的实例方法,都是要 访问类的实例属性的。(包括:创建、修改、删除 类的实例属性) 
- 静态方法 不能访问 实例属性 
- 如果 实例属性名称 和 静态属性名称 重复了 - 通过 类实例 访问该属性,访问的是 实例属性 
- 通过 类名 访问该属性,访问的是 类属性。 - class Car: brand = '奔驰' name = 'Car' def __init__(self): # 可以通过实例访问到类属性 print(self.brand) # 定义实例属性和类属性重名 self.name = 'benz car' c1 = Car() print(f'通过实例名访问name:{c1.name}') # benz car print(f'通过类名 访问name:{Car.name}') # Car
 
三、 类之间的关系
1. 继承关系
类之间可能存在 包含关系 ,当一个类 包含 在另一个类中时,我们将 包含的类 叫做 父类(基类) ,将被包含的类叫做 子类(派生类) 。
定义子类的时候必须指定他的父类
# 父类
class BenzCar:
    brand   = '奔驰'
    country = '德国'
    @staticmethod
    def pressHorn():
        print('嘟嘟~~~~~~')
    def __init__(self,color,engineSN):
        self.color  =  color  # 颜色
        self.engineSN = engineSN # 发动机编号
    def changeColor(self,newColor):
        self.color = newColor
# 子类
class Benz2016(BenzCar):
    price   = 580000
    model   = 'Benz2016'
class Benz2018(BenzCar):
    price   = 880000
    model   = 'Benz2018'子类 自动拥有 父类的一切 属性 和 方法
子类 调用 父类的 初始化方法
- 子类初始化方法 和 父类的初始化 相同时,需要 显式的调用 父类的初始化方法,需要传入相应的参数。
def __init__(self,color,engineSN,weight):
    # 先调用父类的初始化方法
    BenzCar.__init__(self,color,engineSN)
    self.weight = weight
    self.oilweight = 0- 调用 父类的 初始化方法,除了使用父类名称,还可以使用 super() 函数- super不仅可以调用 父类的初始化方法,也可以调用 父类的其他方法
 
def __init__(self,color,engineSN,weight):
    # 同样是调用父类的初始化方法
    super().__init__(color, engineSN)
    self.weight = weight
    self.oilweight = 0如果 子类 没有自己的初始化方法, 实例化子类时,解释器会自动调用 父类的初始化方法。
class Rect:
    def __init__(self):
        print('初始化 rect')
class Squre(Rect):
    pass
s = Squre()		# 初始化 rect2. 类的组合关系
组合关系:一个类的实例属性中包含另一个类的实例
# 轮胎
class Tire:
    def __init__(self,size,createDate):
        self.size  =  size  # 尺寸
        self.createDate = createDate # 出厂日期
class BenzCar:
    brand   = '奔驰'
    country = '德国'
    def __init__(self,color,engineSN,tires):
        self.color  =  color  # 颜色
        self.engineSN = engineSN # 发动机编号
        self.tires   =  tires
# 创建4个轮胎实例对象
tires = [Tire(20,'20160808')  for i in range(4)]
car = BenzCar('red','234342342342566',tires)奔驰汽车对象包含 4 个两台对象 和 Tire 对象