0.python 的面向对象
·面向对象编程
·基础
·共有私有
·继承
·组合、Mixin
·魔法函数
·魔法函数概述
·构造类魔法函数
·运算类魔法函数
1.面向对象概述(Objected oriented programing)
面向过程偏向动作
面向对象 :组成元素(老师 通过 网络 向 学生 讲课)
·接触到任意一个任务,首先想到的是任务这个世界的构成,是由模型构成的
·几个名词:
·OOA:面向对象的分析
·OOD:面向对象的设计
·OOI:xxx的实现
·OOP:xxx的编程
OOA->OOD->OOI->OOP
·类和对象的概念
·类:抽象名词,代表一个集合,共性的事物
·对象:具象的事物,单个个体
·类跟对象的关系
·一个具象代表一类事物的某一个个体
·一个是抽象,代表的是一大类事物
·类中的内容应该具有两个内容:
·表明事物的特征。叫做属性(变量)
·表明事物功能或动作。叫做成员方法(函数)
2.类的基本实现
·类的命名
·遵守变量命名的规范
·大驼峰(由多个或者一个单词构成,每个单词首字母大写,单词跟单词直接相连)
·尽量避开跟系统命名相似的命名
·如何声明一个类:
·必须使用class关键字
·类有属性和方法构成,其他不允许出现
·成员属性定义可以直接使用变量赋值,如果没有值,可使用None
·案例 01.py
#访问对象成员
·使用点操作符
obj.成员属性名称
obj.方法
#可以通过默认内置变量检查类和对象的所有成员
·对象所有成员检查:
#dict前后各有两个下划线
obj.dict
·类所有成员
#dict前后各有两个下划线
class_name.dict
3.anaconda基本使用
·anaconda主要是一个虚拟环境管理器
·还是一个安装包管理器
·conda list
1
4.类跟对象的成员分析
·类和对象都可以存储成员,成员可以归类所有,也可以归对象所有
·对象访问一个成员时,如果对象中没有该成员,尝试访问类中的同名成员,
如果对象中有此成员,一定使用对象中的成员
·创建对象的时候,类中的成员不会放入对象中,而是得到一个空对象,没有成员
·通过对象对类中成员重新赋值或者通过对象添加成员时,对应成员会保存在对象中,而不会修改类成员
5.关于self
· self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,
那么该对象会自动传入到当前方法的第一个参数中
·self并不是关键字,知识一个用于接收对象的普通参数,理论上可以用任何一个普通变量名来代替
·方法中有self形参的方法成为非绑定类的方法,可以通过对象访问,没有self的是绑定类方法,只能通过类访问
·使用类访问绑定类的方法时,如果类方法中需要访问当前类的成员,可以通过___class__成员名来访问
6.面向对象的三大特性
·封装
·继承
·多态
6.1封装
·封装就是对对象的成员进行访问限制
·封装的三个级别:
·公开
·受保护的
·私有的
·判别对象的位置
·对象内部
·对象外部
·子类中
·私有
·私有成员是最高级别的封装,只能在当前类或对象中访问
·在成员前面添加两个下划线即可
class Person()
#name是共有成员
name = “allen”
#__age是私有成员
__age = 18
·受保护的封装
·将对象成员进行一定级别的封装,然后在类中或者子类中都可以及逆行访问,但是在外部不可以
·封装方法:在成员名称前添加一个下划线即可
·公开的
·公开的封装对成员的访问没有限制
6.2继承
·继承就是一个类可以获得另外一个类中的成员属性和成员方法
·继承的作用是:减少代码,增加代码的复用功能,同时可以设置类与类直接的关系
·继承与被继承的概念:
·被继承的类叫父类,也叫基类
·用于继承的类叫子类,也叫派生类
·继承与被继承一定存在 is - a 关系
·继承的特征
·所有的子类继承自object类
·子类一旦继承父类,则可以使用父类中除私有成员外的所有内容
·子类继承父类后并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用
·子类中可以定义独有的属性和方法
·子类中定义的成员和父类成员如果相同,则有限使用子类成员
·子类如果想补充父类的方法,可以在定义新方法的同时进行代码重用,
可以使用/父类名.父类成员/的格式来调用父类成员,也可以使用/super().父类成员/的格式来调用
·继承变量函数的查找顺序问题
·有限查找自己的变量
·没有则查找父类
·构造函数如果本类中没有定义,则自动查找调用父类构造函数
·如果本类有定义,则不在继续往上查找
·构造函数
·是一类特殊的函数,在实例化之前进行调用。
·如果定义了构造函数,则实例化时使用构造函数,不查找父类函数
·如果没定义,则自动查找父类构造函数
·如果子类没定义,父类的构造函数带参数,则构造对象时参数应该按父类参数构造
·单继承和多继承
·单继承:每个类只能继承一个类
·多继承:每个类允许继承多个类
多继承案例
class fish():
def init(self,name):
self.name = name
def swim(self):
print “i am swimming”
class bird():
def init(self):
self.name = name
def fly(self):
print “i am flying”
class superman(fish,bird)
def init(self):
self.name = name
s = superman(“xiaohong”)
print s.swim
print s.fly
单继承案例
class GameObject:
def init(self,name):
self.name = name
def pickup(self,player):
pass
class Coin(GameObject):
def init(self,value):
GameObject.init(self,“Coin”) #继承GameObject的初始化方法并补充新的内容
self.value = value
def spend(self,buyer,player):
pass
6.3多态
·多态就是同一个对象在不同情况下的状态出现
·多态不是语法,是一种设计思想
·多态性:一种调用方式,不同的执行效果
7.类相关函数
issubclass:检测一个类是否是另一个类的子类
isinstance:检测一个对象是否是一个类的实例
hasattr:检测一个对象是否有成员xxx
getattr: get attribute
setattr: set attribute
delattr: delete attribute
dir:获取对象的成员列表
8.成员属性操作
#property函数
class person():
def fget(self):
return self._name*2
def fset(self,name):
self._name = name.upper()
def fdel(self):
self._name = "NoName"
name = property(fget,fset,fdel,"对name进行下操作啦")
p1 = person()
p1.name = “tuling”
print p1.name
9.类的常用魔术方法
·魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发
·魔术方法的统一特征,方法名字前后各两个下划线包裹
·init:构造函数
·call:对象当成函数使用的时候触发
#call案例
class A():
def init(self,name = 0):
print “我被调用了”
def call(self):
print “我被调用了again”
a = A()
print a()
·str:当对象当成字符串使用的时候触发
str:案例
class A():
def init(self,name = 0):
print “我被调用了”
def call(self):
print “我被调用了again”
def str(self):
return “这是个例子”
a = A()
print (a)
我被调用了again
这是个例子
·set
·get
·delete
·getattr:访问一个不存在的属性时触发
get attribute案例
class A():
name = “NoName”
age = 18
def getattr(self,name):
print “没找到呀”
print name
a = A()
print a.name
print a.addr
NoName
没找到呀
addr
None 为什么出现None
·setattr:对成员属性进行设置时触发
10.类和对象的三种方法
·实例方法
·需要实例化对象才能使用的方法,使用过程中可能需要截至对象的其他对象的方法完成
·静态方法
·不需要实例化,通过类直接访问
·类方法
·不需要实例化
参考案例
class person:
实例方法
def eat(self):
print self
print"Eating…"
#类方法
#类方法的第一个参数一般命名为cls,区别于self
@classmethod
def play(cls):
print(cls)
print"Playing"
#静态方法
#不需要用第一个参数表示自身或者类
@staticmethod
def say():
print "Saying"
xiaohong = person
xiaohong.eat()
person.play()
xiaohong.play()