python面向对象之继承
今日内容概要
- 动静态方法
- 面向对象之继承理论
- 继承的基本操作
- 对象查找名字的顺序
不继承
单继承
多继承 - 继承的本质
- 基于继承的派生方法(重要)
动静态方法
在类定义的函数有多种特性
1.类中直接定义函数 默认绑定给对象 类调用有几个参数传几个 对象调用第一个参数就是对象自身
2.被@classmethod修饰的函数 默认绑定给类 类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入
意思是把 @staticmethod 下面的函数和所属的类截断了,这个函数就不属于这个类了,没有类的属性了,只不是还是要通过类名的方式调用
------------
@classmethod
def func2(cls):
print(嘿嘿嘿,cls)
3.普普通通的函数,无论是类还是对象调用,都必须是手动传参
@staticmethod
def func3(a):
print('哈哈哈', a)
obj = Student()
# 1.绑定给对象的方法
# obj.func1()
# Student.func1(123)
# 2.绑定给类的方法
Student.func2() # fun2(Student)
obj.func2() # func2(Student)
# 3.静态方法
# Student.func3(123)
# obj.func3(321)
类:

这张图很好的诠释了类,就是把变量和函数包装在一起。
当然我们包装也不是毫无目的的包装,我们会把同性质的包装在一个类里,这样就方便我们重复使用。
所以学到现在,你会发现很多编程的设计,都是为了我们能偷懒,重复使用。
面向对象之继承的概念
面向对象有三大特性:
封装 继承 多态
三者中继承最为核心(实操最多,体验感最强)
封装:
封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是 增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限 来使用类的成员。。
继承:
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
多态:
它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。
首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子
1. 继承的含义:
- 在现实生活中继承表示人与人之间资源的从属关系
- 在编程世界中继承表示类与类之间资源的从属关系
2.继承的目的:
- 在现实生活中儿子继承父亲就拥有了父亲所有资源的支配权限
- 在编程世界中类A继承类B就拥有了类B中所有的数据和方法使用权限
3.继承的实操
class Son(Father):
pass
1.在定义类的时候类名后面可以加括号填写其他类名 意味着继承其他类
2.在python支持多继承 括号内填写多个类名彼此逗号隔开即可
class Son(F1, F2, F3):
pass
1.继承其他类的类 Son
我们称之为子类、派生类
2.被继承的类 Father F1 F2 F3
我们称之为父类、基类、超类
ps:我们最常用的就是子类和父类
继承的本质
对象:数据和功能的结合体
类(子类):多个对象数据和功能的结合体
父类:多个类(子类)相同数据和功能结合体
PS:继承本质应该分为两个部分:
抽象:将多个类相同的东西抽取出去形成一个新的类
继承:将多个类继承刚刚抽取出来的新的类
名字的朝招顺序
1.不继承的情况下名字的查找顺序
------------
对象查找名字的顺序
1.先从自己的名称空间中查找
2.自己没有再去产生该对象的类中查找
3.如果类中也没有 那么直接报错
对象自身 >>> 产生对象的类
------------
2.单继承情况下名字的查找顺序
------------
查找自身 >>>>产生对象的类>>父类
强调:对象点名字 永远从对象自身开始一步步查找
以后在看到self.名字的时候 一定要搞清楚self指代的是哪个对象
------------
3.多继承情况下名字的查找顺序
------------
菱形继承
广度优先(最后才会找闭环的定点)
非菱形继承
深度优先(从左往右每条道走完为止)
ps:mro()方法可以直接获取名字的查找顺序
对象自身 >>> 产生对象的类 >>> 父类(从左往右)
经典类与新式类
"""
经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
在python2中有经典类和新式类
在python3中只有新式类(所有类默认都继承object)
"""
class Student(object):pass
ps:以后我们在定义类的时候 如果没有其他明确的父类 也可能习惯写object兼容
派生方法
子类基于父类某个方法做了扩展
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
class Student(Person):
def __init__(self, name, age, gender, sid):
super().__init__(name, age, gender) # 子类调用父类的方法
self.sid = sid
class Teacher(Person):
def __init__(self, name, age, gender, level):
super().__init__(name, age, gender)
self.level = level
stu1 = Student('jason', 18, 'male', 666)
print(stu1.__dict__)
tea1 = Teacher('tony', 28, 'female', 99)
print(tea1.__dict__)
class MyList(list):
def append(self, values):
if values == 'jason':
print('jason不能尾部追加')
return
super().append(values)
obj = MyList()
print(obj, type(obj))
obj.append(111)
obj.append(222)
obj.append(333)
obj.append('jason')
print(obj)

浙公网安备 33010602011771号