第六周总结
面向对象与类
面向对象概述
面向对象可以说是一种编程思想,我们之前所学习的变成可以称之为面向过程编程,就是按照流程一步一来,但是面向对象不是。首先面向对象在编程中就是数据与功能的绑定,即功能或数据只能给特定的对象使用,其次对象在python中可以看成是容器用于存放数据与功能,那么可以概括地说对象就是数据与功能的结合体
ps:python中一切皆对象
面向对象之类与对象
面向对象不是一门新的技术,但是为了使用方便和很好的区分开,针对面向对象设计了新的语法格式,在python中要产生对象就必须要借助类
类的语法结构:
class 类名(通常首字母大写):
对象公共的数据
对象公共的功能
1.class 是定义类的关键字
2.类名的命名与变量名几乎一致,但是为了区分开类名与变量名所以一般推荐类名首字母大写
3.数据就是变量名与数据值的绑定,功能就是函数
类的定义与调用
类在定义阶段就会执行类体代码,但这是属于类的局部名称空间,外界无法直接调用,如果需要访问数据或功能,那么可以统一采用句点符
要访问数据可以通过点加变量名来访问
类名加括号是产生对象,产生的对象本身没有任何数据,但是它可以通过点加变量名的方式来使用类里面的数据和方法
对象独有的数据与方法
class Student:
school_name = '老男孩'
def __init__(stu, name, age):
stu.name = name # stu.__dict__['name'] = name
stu.age = age
def choice_course(self):
print('选择课程')
stu1 = Student('laj', 3)
print(stu1.__dict__) # {'name': 'laj', 'age': 3}
这是对象独有数据的添加
严格意义上来说对象没有自己独有的功能,它所使用的功能是定义在类里面的公共函数,只是类有一个特征:功能是公共的,结果是独有的(对象在使用功能时会将自己当做第一个参数传入)
class Student:
school_name = '老男孩'
def __init__(stu, name, age):
stu.name = name # stu.__dict__['name'] = name
stu.age = age
def choice_course(self):
print('选择课程')
Student.choice_course(123) # 选择课程
stu1.choice_course() # 选择课程
动静态方法
类中定义的函数有多种特性
class Student:
school_name = '羊村'
# 类中直接定义的函数默认绑定给对象,类调用时需要几个参数就传几个参数,对象调用时会将自己当做第一个参数传进去
def func1(self):
print('喜羊羊牛掰噶拉斯')
# 被@classmethod修饰的函数,默认绑定给类,类调用时第一个参数就是类本身,对象调用时会将产生该对象的类当做第一个参数传进去
@classmethod
def func2(cls):
print('舔狗沸羊羊')
# 普通的函数,无论是类还是对象调用都需要手动传参
@staticmethod
def func3(a):
print('羡慕懒洋洋')
obj = Student()
obj.func1() # 喜羊羊牛掰噶拉斯
Student.func1(1) # 喜羊羊牛掰噶拉斯
Student.func2() # 舔狗沸羊羊
obj.func2() # 舔狗沸羊羊
Student.func3(1) # 羡慕懒洋洋
obj.func3(2) # 羡慕懒洋洋
面向对象之继承
面向对象中继承的概念
面向对象三大特性:封装、继承、多态
1.继承的含义
表示资源的从属关系
eg:爸爸有一个亿,儿子啥都没有,但是儿子继承了爸爸后就可以使用这一个亿
编程中也一样,A类有数据和功能,B类没有,那么B类继承了A类后就拥有了A类的数据和功能
2.继承实操
class Father:
money = '我有一个亿'
class son(Father):
pass
1.继承类(son)我们称之为子类、派生类
2.被继承类(Father)我们称之为父类
3.子类定义时要继承谁就在括号内填写谁的名字, 继承多个时括号内直接填写多个类名用逗号隔开即可
3.继承的本质
继承的本质可以参考类和对象
对象是数据与功能的结合体
类是多个对象的相同数据和功能的结合体
父类是多个子类的相同数据和功能的结合体
# 都是为了节省代码!!!
继承本质可以分为两部分
抽象:把多个类相同的东西抽出去组成一个新的类
继承:多个类继承刚刚抽取出的新类
名字的查找顺序
1.不继承情况下名字的查找顺序
先从对象自己的名称空间中查找
再去产生该对象的类中查找
如果类里面也没有则报错
2.单继承下名字的查找
先找对象自己,再找产生对象的类,最后找父类,都没有就报错
3.多继承情况下名字的查找顺序
如果继承的父类没有继承那么就是按照继承时括号内填写的顺序从左往右查找
其他情况:
情况一
class S1(F1):
a = 4
class S2(F2):
a = 5
class S3(F3):
a= 6
class B(S1, S2, S3):
pass
obj1 = B()
print(obj1.a)
此种情况称之为非菱形继承,它的查找顺序是(关系图见图一)
obj1 > B > S1 > F1 > S2 > F2 > S3 > F3
非菱形继承的特点是深度优先(从左往右每条分支都走完再去下一条分支)
情况二:菱形继承
class G:
a = 7
class F1(G):
a = 1
class F2(G):
a = 2
class F3(G):
a= 3
class S1(F1):
a = 4
class S2(F2):
a = 5
class S3(F3):
a= 6
class A(S1, S2, S3):
pass
obj = A()
print(obj.a)
此种情况称之为菱形继承,它的查找顺序是(关系图见图二)
obj1 > B > S1 > F1 > S2 > F2 > S3 > F3 > G
菱形继承的特点是广度优先,闭环的点G最后才会去找
图一
图二
经典类与新式类
经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
在python2中有经典类和新式类
在python3中只有新式类(所有类默认都继承object)
派生方法
子类基于父类的某个方法做了扩展
class A:
def __init__(self, a, b, c)
self.a = a
self.b = b
self.c = c
class B(A):
def __init__(self, a, b, c, d)
super().__init__(a, b, c)
self.d = d
A类中定义了一个方法,但是这个方法只能添加a,b,c三个数据,现在需要多添加一个数据d,原本A类中的方法不能改
所以就用到了派生方法
在不改变原方法的基础上做扩展
标签:总结,__,name,面向对象,继承,第六周,对象,class
From: https://www.cnblogs.com/zyg111/p/16862796.html