1. 面向对象基础
先有类再有对象
python内置的相关属性:
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
类中数据属性是所有对象共享
函数属性默认绑定给对象用的
先从对象自己的名称空间找,没有再去类中找,没有就报错
对象调用:
类中函数没任何修饰以及数据属性默认是绑定给对象使用的,对象内自己的数据属性是独有的
类调用:
在函数上被 @classmethod修饰,即绑定类,将类作为参数传入
调用规则:
绑定给谁就由谁来调用,谁来调用就会将自己作为第一个参数传入
类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法
既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用
但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数
2.继承、派生及多态
2.1 继承
创建新类的方式,继承一个或者多个父类,
继承了父类的功能
经典类:没有继承object以及该类的子类都是经典类
新式类:继承object以及该类的子类
将相同的属性抽取成父类,再继承
2.2 派生
子类自己添加新的属性,如果与父类属性重名那么以自己的为准
组合:在一个类中把另一个类的对象作为数据属性
应用:两个类之间显著不同,其中一个类是另外一个类所需的组件,可以使用组合
接口:函数的集合
归一化:基于同一个接口实现的类,那么这些类产生的对象在使用时,从用法上来说都一样
2.3 继承原理(菱形继承)
类是经典类时,多继承情况下,按照深度优先的原则,
新式类的话,广度优先的原则
print(cls.__mro__) # 查看新式类的继承顺序
1、指名道姓调用
父类名.__init__(属性名。。。)
2、super().__init__(属性名..)
注:super()相当于super(子类名,self)
2.4 多态与多态性
多态:
一类事物的多种状态
多态性:
每个对象用自己的方式响应共同的对象,(铃声,老师下班,学生放学)
优势:同一种方式去调用
可扩展性,灵活性
2.5 封装
双下划线开头的方式将属性隐藏起来,只发生于类定义阶段
本质是是一个变形操作,(__属性名)成了(_类名__属性名)
访问:
类内部可以通过(__属性名)访问,类外部要通过(_类名__属性名)才能访问
1、封装数据:隐藏数据后,提供操作该数据的接口,在接口上附件对该数据的使用限制
2、隔离复杂度,使用简单的接口
2.6 特性(property)
将@装饰在函数上,调用该函数通过函数名就可以得到返回值
class Circle:
def __init__(self,radius): #圆的半径radius
self.radius=radius
@property
def area(self):
return math.pi * self.radius**2 #计算面积
@property
def perimeter(self):
return 2*math.pi*self.radius #计算周长
c=Circle(10)
print(c.radius)
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter)
类实现者可以修改封装内的东西而不影响外部调用者的代码