Agenda
面向对象思想
类的定义
属性
属性修饰器
方法
操作符重载
继承和多态
封装、继承、多态
面向过程、面向对象、面向函数
面向对象的思想,用类和对象对现实世界进行抽象
类:对事物的抽象
对象:是类的一个实例
类的组成:有变量和函数组成(属性、方法)
变量:属性、成员属性、是对数据的封装
函数:方法、成员方法、是对行为的封装
对象的组成:对象是由类实例化后得到的,所以也由属性和方法组成
面向对象的3大特点
封装、继承、多态
类的定义
class关键字定义类,类的首字母大写,习惯问题
类内有属性和方法
class Dog():
属性定义
方法定义
调用类型 变量名=类名()
1 class Dog():2 pass3 wangcai=Dog()4 print wangcai
类
经典类
类型
新式类
__new__
super
__slot__
区分方式:type(calss name)
新式类:type
经典类:classobj
1 class Dog: 2 pass 3 class DognNew(object): 4 pass 5 print type(Dog),type(DognNew) 6 class hebei(Dog): 7 pass 8 class jinmao(DognNew): 9 pass10 print type(hebei),type(jinmao)
定义类
属性:数据封装
类属性
类共同拥有的属性,类中定义
放到类中记录
实例属性
类中def定义
放到实例中记录
属性的可见性
公有属性
内置属性
私有属性
dir(实例名)
方法:对类的行为的封装
实例方法:self关键字,通过self访问实例属性,调用实例方法
特殊方法:编译器自动添加的方法,self关键字
静态方法:@staticmethod
类方法:@classmethod
#Chinese继承自Person
clss Chinese(Person):
nation='china'
def __init__(self,name):
self.__name__=name
def msg(self):
print self.name
1 # !/usr/bin/python 2 # encoding:utf8 3 4 5 6 class Person(): 7 pass 8 class Chinese(Person): 9 """10 author:tester11 """12 native='China'13 def __init__(self,name,age,sex):14 self.name=name15 self._age=age16 self.__sex=sex17 def __updatemethod(self):18 self.name +='updated'19 self._Chinese__sex +='updated'20 return self21 22 zhang=Chinese('zhangname','zhangage','zhangsex')23 print dir(Chinese)24 print dir(zhang)25 print zhang.name,zhang._age,zhang._Chinese__sex26 27 print zhang._Chinese__updatemethod()28 # 直接更新实例zhang的所有数据29 print zhang.name,zhang._age,zhang._Chinese__sex
访问属性
直接访问
自定义get、set方法
通过属性修饰器
@property
@***.setter
@***.deleter
描述符
代码重用
1 class Person(): 2 pass 3 class Chinese(Person): 4 """ 5 author:tester 6 """ 7 native='China' 8 def __init__(self,name,age,sex): 9 self.name=name10 self._age=age11 self.__sex=sex12 def __updatemethod(self):13 self.name +='updated'14 self._Chinese__sex +='updated'15 return self16 def getname(self):17 return self.name18 def setname(self,name):19 self.name=name20 @property21 def Age(self):22 return self._age23 @Age.setter24 def Age(self,age):25 self._age=age26 @Age.deleter27 #這里的代码有问题,还需要处理28 def Age(self):29 print '屌丝……年轮是可以删除的吗?!'30 # del self._age31 32 zhang1=Chinese('zhang1name','zhang1age','zhang1sex')33 print zhang1.getname()34 zhang1.setname('zhang1')35 # print zhang1.getname()36 # print zhang1.Age37 # zhang1.Age=3038 # print zhang1.Age39 print zhang1.Age40 # print dir(zhang1)41 #這里的代码有问题,还需要处理42 # del zhang1._age43 print zhang1.Age44 # print zhang1.name,zhang1._age,zhang1._Chinese__sex
方法
实例方法:self做第一个参数,被绑定到对象本身,self指向对象本身的指针
分公有和私有
特殊方法(内置方法):__init__\__str__\__cmp__
类方法:用@classmethod装饰器修饰,第一个参数是cls,被绑定到类,单例模式
静态方法:用@staticmethod装饰器修饰,无self或者cls参数,没有绑定,相当于普通函数
1 # !/usr/bin/python 2 # encoding:utf8 3 4 5 6 class Person(): 7 pass 8 class Chinese(Person): 9 native='China'10 def __init__(self,id,name,address,age,city):11 self.name=name12 self.id=id13 self.age=age14 self.address=address15 self.city=city16 @classmethod17 def getPeoplebyParent(cls,sibling):18 if sibling==1:19 return cls(1,'huang','address',12,'city')20 else:21 print '无对应关系'22 @classmethod23 def getPeoplebysSibling(cls,sibling):24 if sibling ==None:25 print 'shangdi'26 else:27 return cls(1,'huang2','address',12,'city')28 @staticmethod29 def someone():30 pass31 zhang=Chinese.getPeoplebyParent(1)32 try :33 print zhang.name34 except AttributeError:35 print '无对应关系,shib'36 37 huang=Chinese.getPeoplebysSibling('')38 try :39 print huang.name40 except AttributeError:41 print '无对应关系,shib'
运算符重载
构造函数、析构函数
__new__\__init__\__del__
四则运算:+-*/
__add__\__sub__\__mul__\__div__
比较运算
__lt__\__gt__\__cmp__
其他
__str__\__repr__\__contains__\__bool__
继承和多态
继承
根据已有的类,定义新的类
继承的目的:代码重用、多态
调用父类的方法:父类.方法名(self);super(子类名,self).方法名()
多重继承
菱形继承问题
经典类:深度优先
新式类:广度优先
super.(子类名.self)
实现向量的加乘
加常量
两个向量相加
乘常量
两个向量相乘
两个向量的点集