面向对象

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)
  • 封装与扩展性
类实现者可以修改封装内的东西而不影响外部调用者的代码
原文地址:https://www.cnblogs.com/quqinchao/p/11257681.html