python-类
类
意义:归类,组织数据结构
1.多态:不需要关心对象的类型
2.封装:属于对象自己的变量
3.继承:继承父类的属性方法
所有单词首字母都大写
1 | class StudentName(): |
私有属性方法
1.类会创建独立的命名空间,self
参数指代的是所创建的对象实例自身。每当调用类的方法时,就将对象自身(用self来指示)作为一个参数传入。self不是关键字,其实用其他的命名也是可以的。
2.私有属性(变量)和方法以两个下划线开头
3.私有方法(以及变量)通过直接调用是无法访问的,但是可以通过下划线加类名来访问
1 | a=Student() |
对象属性何时创建
1 | class Member(): |
可以看出a和b都是访问的同一个属性count,那么对象创建时并没有克隆一份自己的变量,仍然引用类的属性。
但是如果对属性赋值,那么对象会克隆一份自己的属性
1 | a.count='Two' |
继承
1 | class Teacher(Member): |
在类名的后面添加要继承的类的名字
继承以后可以改写父类的方法
查看是否为继承关系
1
issubclass(Teacher, Member)
访问父类
1
Teacher.__bases__
查看对象是否为类的实例
1
2isinstance(a,Teacher)
isinstance(a,Member)
接口
实现特定的功能,定义方法,被子类继承。需要被实现,如果不实现,那么只能被继续继承。
访问a对象是否有方法
init
。方法要用引号括起来1
2hasattr(a, 'init')
getattr(a,'init',None)查看对象存储的所有值
1
a.__dict__
1
2
3import datetime as dt
print(dt.__dict__)
抽象基类
不能被实例化的类(建议),定义子类应该实现的一组抽象方法:
1 | from abc import ABC, abstractmethod |
其中
@abstractemthod
为装饰器,用来标记抽象,指定在子类中必须实现的方法抽象类只能被继承,不能实例化。主要用来作为一种规范。
1
2class GamePlay(XiaoFenDui):
pass如果没有实现父类的方法,那么它也只能被继承。不能实例化。
鸭子模型
1.实现超类的方法(至少是爷爷辈的)
只要实现了XiaoFeiDui
的方法,即使不是它的对象,也可以认为是XiaoFeiDui
的子类
1 | class Play(GamePlay): |
2.注册为其子类
即使没有继承以及实现父类的方法,只要注册为XiaoFenDui
的子类,同样被视为它的子类
1 | class FakePlay(): |
3.鸭子模型的思考
为什么需要鸭子模型呢?可能在别的语言看来这是不严谨的语法,大多数人是这么说的,于是我们也这么认为。但是不严谨带来的后果是啥?有人说的出来吗,但是我知道python的这种鸭子模型的优势:这么做的意义在于可以继承父类,那么也就拥有了其属性和方法。大大简化了语法,就像我们为什么要写一个函数一样,还不是为了避免写重复的东西浪费时间与字数。写个函数几个字就可以拿来引用那一段函数了。同样类也是一样,只不过其更大了,因为它包括了函数,它是一系列函数和属性的集合。
所以我们在写一个程序的时候最先应该做的不是动手去写,而是应该思考如何架构。是写一个类,一个函数,还是一个lambda表达式?或者这些都不用。思考好了永远要好一些,至少思路更加清晰。思考胜于动手啊!