【Python编程】之面向对象
目录
一、面向对象基本概念
1.1、类的定义
1.2、类的实例化
1.3、类的基本结构
1.4、类的命名
1.5、对象、类的相关操作
二、面向对象三大特征
2.1、封装
2.2、继承
2.2.1、单继承
2.2.2、多继承
2.3多态
一、面向对象基本概念
-
类:用几大特征表述一一类事物。类要表达的是一个抽象的概念。
-
对象:对象是类的具体实现。举个例子,类像是一张图纸,对象是由这张图纸产出的具体物品。类只有一个,但是对象可以同这个类实例出多个。
对象是类的实例,类是对象的模板。
类中的成员只有属性和方法,不要裸露地把判断和循环写在类中,而要用方法包起来。
1.1、类的定义
class Car:
pass
#推荐使用下面定义方式
class Car():
passclass Car(object):
pass
1.2、类的实例化
class Car():
pass#类的实例化,实例化对象,new新对象
obj = Car()
1.3、类的基本结构
#类中只有成员属性和成员方法
class Car():
color="咖啡色" #成员属性
def run(self): #成员方法 (self)代表对象本身
print("fast")
1.4、类的命名
类的命名推荐使用驼峰命名法,如:MyCar
1.5、对象、类的相关操作
1.5.1成员等级
python对成员的保护分为两个等级:
-
私有的(private):在本类内部可以访问,类的外部不可以访问。(python中属性或者方法前面加两个下划线"_")
-
公有的(public):在本类的内部和外部都可以访问。
对象的语法:
对象.属性
对象.方法()
案例
公有成员
class Car:color = "red"logo = "BMW"def run(self):print("Car is running")
BMW = Car()
print(BMW.color)
print(BMW.logo)
BMW.run()输出结果
red
BMW
Car is running
私有成员
class Car:color = "red"__logo = "BMW"def run(self):print("Car is running")输出结果
发生异常: AttributeError
'Car' object has no attribute '_logo'File "E:\VScode\python\demo02.py", line 9, in <module>print(BMW._logo)^^^^^^^^^
AttributeError: 'Car' object has no attribute '_logo'
公有方法、私有方法
class Car:color = "red"__logo = "BMW"logo=__logodef run(self):print("Car is running")def __info(self):print("This is a car")def info(self):self.__info()BMW = Car()
print(BMW.color)
print(BMW.logo)
BMW.info()
BMW.run()输出结果
red
BMW
This is a car
Car is running
二、面向对象三大特征
2.1、封装
如上
2.2、继承
一个类继承另外一个类,那么该类就是子类(衍生类),被继承的这个类叫做父类(超类,基类)
继承:
(1)单继承 (2)多继承
python3中所有的类都默认继承父类object
2.2.1、单继承
(1)子父继承之后,子类可以调用父类的公有的属性和方法
(2)子父继承之后,子类不可以调用父类的私有成员
(3)子父继承之后,子类可以改写父类的方法
(4)子父继承之后,子类优先调用自己的成员属性方法,如果没有则调用父类的属性方法,如果都没有,直接报错
案例
class newCar(Car):passnewCar = newCar()
print(newCar.color)输出结果
red
class newCar(Car):def info(self):return "This is a new car" + " 颜色是" + self.color + " 品牌是" + self.logonewCar = newCar()
print(newCar.color)
print(newCar.info()) 输出结果
red
This is a new car 颜色是red 品牌是BMW
2.2.2、多继承
super的用法:
(1)super本身是一个类,super()是一个对象,用于调用父类的绑定方法
(2)super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)
(3)super用途:解决复杂的多继承调用关系
案例
class Father():property="抽烟喝酒"def f_hobby():print("喜欢抽烟喝酒")
class Mother():property="化妆品包包"def m_hobby(self):print("逛街买化妆品包包")
class Son(Father,Mother):property="打游戏看直播"#1.利用类来调用父类的属性和方法def skill1(self):Father.f_hobby()print(Mother.property)#2.利用对象调用父类的属性和方法#self在调用父类方法属性的时候,在本类有的时候,先调用自己的,如果没有,再调用父类的def skill2(self):self.m_hobby()#无,调用父类print(self.property)#有,调用自身#3.利用super调用父类的属性和方法#super()只调用父类的相关公有成员,不会调用自己本类中的公有成员,super()特指调用父类,跟self有区别def skill3(self):print(super().property)#多个父类,按顺序继承super().m_hobby()#只应用在绑定方法中son = Son()
son.skill1()
son.skill2()
son.skill3() 输出结果:
喜欢抽烟喝酒
化妆品包包
逛街买化妆品包包
打游戏看直播
抽烟喝酒
逛街买化妆品包包
self和super区别:
当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找,然后调用父类的这个方法。
2.3多态
概念:不同的子类对象,调用相同的父类方法,产生了不同的执行效果
关键字:继承,改写
多态作用:在不改写父类代码的前提下,能实现不同的效果