1、面向对象的优点:
面向对象是一种结构化的编程方式,好处如下:
(1)通过封装明确了内、外
(2)通过继承+多态在语言层面支持了归一化设计
归一化设计原理:使用接口函数、一切皆文件
2、类的定义
类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来产生真实的物体(实例)
3、对象的定义
你看到的一切事物都是一个个的对象,可以把对象理解成为一个具体的事物(拥有数据和动作的结合体)
4、类和对象的关系
对象都是由类产生的,上帝造人,首先有一个造人的模板,这个模板即人的类,然后上帝根据类的定义来生产一个个的人
5、实例化定义
由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例=对象)
6、面向对象设计:将一类具体事物的数据和动作整合到一起
7、面向对象编程:用了定义类+实例对象的方式去实现面向对象的设计
8、静态方法
staticmethod静态方法只是名义上的归属类,不能使用类变量和实例变量,是类的工具包
class Room:
def __init__(self,name,owner,width,length):
self.name=name
self.owner=owner
self.width=width
self.length=length
@property
def cal_area(self):
area=self.width * self.length
return area
@staticmethod
def wash_room():
print("这里是洗浴室")
R1=Room("别墅","lalala",100,100)
print(R1)
#输出结果:
<__main__.Room object at 0x1038f51c0>
9、组合
(1)定义:定义一个类,通过数据属性形成一个实例化的对象,这就是组合
(2)用途:
- 各个做关联
- 小的组成大的
10、面向对象三大特性:继承、封装、多态
(1)继承
- 继承分为单继承和多继承
- 子类继承了父类的所有属性,如果重名,子类先执行自己内部定义
class ParentClass1:
pass
class ParentClass2:
pass
#单继承
class SonClass1(ParentClass1):
pass
#多继承
class SonClass2(ParentClass1,ParentClass2):
pass
(2)继承和集合的选择?
- 当类之间有显著不同,较小的类是较大的类的组件的时候,用集合比较好
- 当类之间有很多相同的功能,提取这些共同的功能做成基类的时候,用继承比较好,如下实例
class animal:
def eat(self):
pass
def drink(self):
pass
def la(self):
pass
def sa(self):
pass
class dog(animal):
def wang(self):
print("汪汪汪")
class cat(animal):
def miao(self):
print("喵喵喵")
(3)继承的含义
- 继承父类的方法,并且做出自己的改变或者扩展(代码重用)
但是这种方法不太好,一般写代码规范耦合度越小越好,这样是强耦合 - 声明于某个子类兼容于某父类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法
class animal:
def eat(self):
pass
def drink(self):
pass
class dog(animal):
def eat(self):
print("c吃")
def drink(self):
print("喝")
def wang(self):
pass
说明:
- 接口继承实质上是要求作出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现特定接口的所有对象——这在程序设计上,叫做”归一化“
- 接口类的存在是为了规范子类
- 接口继承不同于普通继承,接口继承中子类必须继承父类的方法,父类方法仅定义即可,具体行为可以在子类中实现,如上。
- 接口继承需要导入一个abc模块,父类加上对子类的限制,并且在父类方法加装饰器,如下
import abc
class animal(metaclass=ABCMeta):
@abc.abstractmethod
def eat(self):
pass
class dog(animal):
@abc.abstractmethod
def eat(self):
print("c吃")
def wang(self):
pass
(4)继承顺序
- Python的类可以继承多个类,Java和C#中只能继承一个类
- Python的类如果继承了多个类,继承的顺序有两种:深度优先和广度优先,在python3中都是按照广度优先的方式
- 深度优先:按照一侧找到底,再从另一侧开始找
- 广度预先:按照一侧开始找,找到不包含父类的前一类,再从另一侧开始找
当类是经典类的时候,多继承的情况下,会按照深度优先的方式查找
当类是新式类的时候,多继承的情况下,会按照广度优先的方式查找
区分经典类和新式类:
新式类包含很多功能,从写法上父类继承了object类测试新式类,否则是经典类
经典类:
class A:
pass
class B(A):
pass
新式类:
class A(object):
pass
class B(A):
pass
(5)子类调用父类方法,可以直接引用父类的__ init__()函数
class Vehicle:
Country="China"
def __init__(self,name,speed,load,power):
self.name=name
self.speed=speed
self.load=load
self.power=power
def run(self):
print("开动啦")
class Subway(Vehicle):
def __init__(self,name,speed,load,power,line):
Vehicle.__init__(self,name,speed,load,power)
self.line=line
def show_info(self):
print(self.name,self.speed,self.load,self.power,self.line)
S1=Subway("地铁","543m/s","10000000","电","13号线")
S1.show_info()
输出结果:
地铁 543m/s 10000000 电 13号线
也可以直接用supper()调用,就把Vehicle.__init__变成supper.init