python面向对象编程基本规则
Agenda
面向对象思想
类的定义
属性
属性修饰器
方法
操作符重载
继承和多态
封装、继承、多态
面向过程、面向对象、面向函数
面向对象的思想,用类和对象对现实世界进行抽象
类:对事物的抽象
对象:是类的一个实例
类的组成:有变量和函数组成(属性、方法)
变量:属性、成员属性、是对数据的封装
函数:方法、成员方法、是对行为的封装
对象的组成:对象是由类实例化后得到的,所以也由属性和方法组成
面向对象的3大特点
封装、继承、多态
类的定义
class关键字定义类,类的首字母大写,习惯问题
类内有属性和方法
class Dog():
属性定义
方法定义
调用类型 变量名=类名()
1 class Dog(): 2 pass 3 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 pass 10 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:tester 11 """ 12 native='China' 13 def __init__(self,name,age,sex): 14 self.name=name 15 self._age=age 16 self.__sex=sex 17 def __updatemethod(self): 18 self.name +='updated' 19 self._Chinese__sex +='updated' 20 return self 21 22 zhang=Chinese('zhangname','zhangage','zhangsex') 23 print dir(Chinese) 24 print dir(zhang) 25 print zhang.name,zhang._age,zhang._Chinese__sex 26 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=name 10 self._age=age 11 self.__sex=sex 12 def __updatemethod(self): 13 self.name +='updated' 14 self._Chinese__sex +='updated' 15 return self 16 def getname(self): 17 return self.name 18 def setname(self,name): 19 self.name=name 20 @property 21 def Age(self): 22 return self._age 23 @Age.setter 24 def Age(self,age): 25 self._age=age 26 @Age.deleter 27 #這里的代码有问题,还需要处理 28 def Age(self): 29 print '屌丝……年轮是可以删除的吗?!' 30 # del self._age 31 32 zhang1=Chinese('zhang1name','zhang1age','zhang1sex') 33 print zhang1.getname() 34 zhang1.setname('zhang1') 35 # print zhang1.getname() 36 # print zhang1.Age 37 # zhang1.Age=30 38 # print zhang1.Age 39 print zhang1.Age 40 # print dir(zhang1) 41 #這里的代码有问题,还需要处理 42 # del zhang1._age 43 print zhang1.Age 44 # 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=name 12 self.id=id 13 self.age=age 14 self.address=address 15 self.city=city 16 @classmethod 17 def getPeoplebyParent(cls,sibling): 18 if sibling==1: 19 return cls(1,'huang','address',12,'city') 20 else: 21 print '无对应关系' 22 @classmethod 23 def getPeoplebysSibling(cls,sibling): 24 if sibling ==None: 25 print 'shangdi' 26 else: 27 return cls(1,'huang2','address',12,'city') 28 @staticmethod 29 def someone(): 30 pass 31 zhang=Chinese.getPeoplebyParent(1) 32 try : 33 print zhang.name 34 except AttributeError: 35 print '无对应关系,shib' 36 37 huang=Chinese.getPeoplebysSibling('') 38 try : 39 print huang.name 40 except AttributeError: 41 print '无对应关系,shib'
运算符重载
构造函数、析构函数
__new__\__init__\__del__
四则运算:+-*/
__add__\__sub__\__mul__\__div__
比较运算
__lt__\__gt__\__cmp__
其他
__str__\__repr__\__contains__\__bool__
继承和多态
继承
根据已有的类,定义新的类
继承的目的:代码重用、多态
调用父类的方法:父类.方法名(self);super(子类名,self).方法名()
多重继承
菱形继承问题
经典类:深度优先
新式类:广度优先
super.(子类名.self)
实现向量的加乘
加常量
两个向量相加
乘常量
两个向量相乘
两个向量的点集

浙公网安备 33010602011771号