
1.面向对象定义
1 class room: 2 def man(self,args): 3 print(args,self) 4 pass 5 def woman(self,args): 6 print() 7 pass 8 9 10 11 obj = room() 12 obj.man('bb') 13 print(obj) 14 15 16 17 ''' 18 19 bb <__main__.room object at 0x0000012EFF3A2E10> 20 <__main__.room object at 0x0000012EFF3A2E10> 21 22 ''' 23 24 25 obj2 = room() 26 obj2.man('bb') 27 print(obj2) 28 29 30 ''' 31 32 bb <__main__.room object at 0x0000012EFF3A2E48> 33 <__main__.room object at 0x0000012EFF3A2E48> 34 35 ''' 36 #------------------------------------------------------ 37 #self 传的是room类创建的对象的地址(python内部自动替我们传递)
38 #通俗点,哪个对象执行该方法,self传递的就是哪个对象的地址
2.面向对象三大特性
a.封装:为了使得代码简洁,不用重复传参。
1 #第一种封装方式; 2 3 class foo: 4 def creat(self,ab): 5 print(self.ab) 6 7 8 obj = foo() 9 obj.ab = "wwwwww" 10 11 obj.creat('ab') 12 13 14 15 #第二种封装方式: 16 17 class Foo: 18 def __init__(self,ab): 19 ''' 20 构造方法 21 :param ab: 22 ''' 23 self.ab = "wwwwww" 24 def creat(self): 25 print(self.ab) 26 27 28 obj = Foo("ab") 29 obj.creat() 30 31 32 33 34 #使用场景: 35 36 #1.当同一类型的方法具有相同的参数的时候,直接封装到对象即可; 37 #2.把类当作模版,创建多个对象(对象内封装的数据可以不一样)
写个例子:
1 class person: 2 def __init__(self,name,age,weight): 3 self.Name = name 4 self.Age = age 5 self.Weight = weight 6 7 def eating(self): 8 self.Weight += 2 9 10 def execise(self): 11 self.Weight -= 1 12 13 import pickle 14 15 obj = person('XM',18,107) 16 obj.eating() 17 obj.execise() 18 obj.eating() 19 ret = pickle.dump(obj,open('queen.log','wb')) 20 21 ret = pickle.load(open('queen.log','rb')) 22 print(ret.Weight) if ret else print ('请创建你的对象!')
b.继承
继承知识点:单继承、多继承、多继承的优先搜索顺序
1 注意: 2 1.Animals 称作父类,又称基类;Dog 称作子类,又称作派生类 是相对的,可以嵌套。 3 2.子类可以继承父类里面的所有功能 4 3.当子类与其继承的唯一父类里面具有相同的功能的时候,默认优先执行子类自己的功能(称作单继承) 5 4.在python中子类可以继承多个父类,当多个父类里面具有相同的功能的时候优先顺序为从左至右 6 7 class Animals: 8 def eating(self): 9 print(' %s - %s'% (self.name , '喂食')) 10 def drinking(self): 11 print(' %s - %s'% (self.name , '喝水')) 12 13 class Function: 14 def working(self): 15 print(' %s - %s' % (self.name, '被宰了')) 16 17 18 19 20 class Dog(Animals,Function): 21 def __init__(self,name): 22 self.name = name #普通字段,在对象里创建 23 def roasting(self): 24 print(' %s - %s'% (self.name , '汪汪')) 25 26 27 meiyu = Dog('meiyu') 28 29 30 meiyu.eating() 31 meiyu.drinking() 32 meiyu.roasting() 33 meiyu.working()
@多继承的优先搜索顺序:


@易错点:如果方法里面又嵌套方法,那就究其本质,看看是谁(对象)调用了这个方法,然后在按照上面的顺序执行。
给个例子:
1 class A: 2 def bar(self): 3 print('BAR') 4 self.f1() 5 6 class B: 7 def f3(self): 8 print('B') 9 class C(A): 10 def f1(self): 11 print('C') 12 13 14 class D(B,C): 15 def f2(self): 16 print('D') 17 18 dd = D() 19 dd.bar() #显然A里面又执行了f1方法,而究其本质,是dd执行,所以回到D类从头开始搜索f1方法。 20
21 #output: 22 #BAR 23 #C
#执行父类构造方法
1 #执行父类构造方法。即父类中字段在初始化时在子类中重写的解决方法。有两种: 2 #1. super(cat,self).__init__() 3 #2. animal.__init__(self) 4 5 6 7 class animal: 8 def __init__(self): 9 print('A构造方法') 10 self.n = '我是动物' 11 12 13 class cat(animal): 14 def __init__(self): 15 print('B构造方法') 16 self.u = "我是猫" 17 super(cat,self).__init__() #最常用这一种 18 19 20 a = cat() 21 22 #输出: 23 B构造方法 24 A构造方法
__dic__ 查看对象中创建的字段
c.多态:多种形态
python中本身就具有多态属性。
扩展:在其它语言(java、c#)中:
重载:类中方法的函数名相同,函数的参数个数不相同的情况。
重写:子类中重新实现父类中的方法。
3.类中的高级成员 :静态字段,静态方法,类方法
#类和对象都可以访问:静态字段,静态方法;普通字段,普通方法
#但作出规范,严格按照以下执行!
#1通过类去访问:静态字段,静态方法,类方法(也即是静态方法的特殊情况,添加了cls参数)
#2.通过对象访问:普通字段,普通方法
1 class province: 2 3 country = 'china' #静态字段,写在类中 4 5 @staticmethod #在指定的方法上面添加@staticmethod,使其变为静态方法 6 def f1(args1,args2,argsn): #f1称作静态方法,可以传参 7 pass 8 9 def f2(self): 10 pass
1 @classmethod #在指定方法上添加@classmethod,使其变为类方法 2 def f3(cls,args1,args2,argsn): #cls 传递该类方法对应的类名 3 pass
4.类的普通成员:字段,方法,特性(属性)
特性:即是将方法伪造成为一种字段
1 class Foo: 2 3 def __init__(self,name): 4 self.name = name 5 pass 6 7 def start(self): 8 temp ='%s sb'% self.name 9 print (temp) 10 11 @property #创建特性,将方法伪造成一种字段 12 def end(self): 13 tart = '%s sb'% self.name 14 print(tart) 15 16 obj = Foo('alex') 17 obj.start() 18 obj.end #将方法伪造成一种字段去执行(即对象后面方法不加括号) 19 20 #output: 21 #alex sb 22 #alex sb
特性如何设置字段呢?
1 class Foo: 2 3 def __init__(self,name): 4 self.name = name 5 pass 6 7 def start(self): 8 temp ='%s sb'% self.name 9 print (temp) 10 11 @property #创建特性,将方法伪造成一种字段 12 def end(self): 13 tart = '%s sb'% self.name 14 print(tart) 15 16 @end.setter #给特性方法设置字段 17 def end(self,arg): 18 print(arg)19 self.name = arg20 21 22 obj = Foo('alex') 23 obj.start() #alex sb 24 obj.end #alex sb 25 26 obj.name = '123' #给对象直接设置字段 27 obj.start() #123 sb 28 obj.end #123 sb 29 30 obj.end = '456' #用特性方法设置字段,并同时执行了@end.setter下的这个end方法。 #456 31 obj.start() #456 sb 32 obj.end #456 sb
小结:
三大特性:封装,继承,多态
面向对象成员:
1.方法: 静态方法(无需使用对象封装的内容,类调用) ;普通方法(使用对象封装的内容,对象调用);类方法
2.字段: 静态字段(对象里面具有相同的封装内容,为了不重复,写在类里) ;普通字段(各对象的封装的内容不一样)
3.特性: 将方法伪造成为字段
如何快速判断类调用还是是对象调用成员呢?
有self 对象
无self 类
5.类成员的修饰符
1 #隐藏类内成员,类内部可获取,外部无法读取,继承时子类也无法访问。 2 3 # __xx 私有 4 # xx 共有 5 6 7 8 9 class Foo: 10 11 ox = 'ox' 12 __xo = 'xo' 13 14 15 16 def __init__(self): 17 pass 18 19 def f1(self): 20 print('hello') 21 print(Foo.__xo) 22 23 24 25 obj = Foo() 26 obj.f1() #由于在类内,可以获取 27 print(Foo.__xo) #在类外无法获取 28 29 30 #python内部特殊语法打破这一规则: 31 32 # obj._Foo__xo
6.类的特殊成员
__init__
__call__
__metaclass__ #类也是对象,__metaclass__ 指定类是由xx创建的对象
__new__

索引、切片
1 # 类后面加括号,执行__init__,并创建对象 2 # 对象后面直接加括号,直接执行__call__ 3 4 5 6 class Foo: 7 8 def __init__(self): 9 print('构造方法') 10 11 def __call__(self, *args, **kwargs): 12 print('call') 13 return 1 14 15 16 17 r = Foo() #执行__init__方法 18 r() #执行__call__方法 19 r = Foo()() #等同于 r() 20 21 22 # __getitem__ 23 # __setitem__ 24 # __delitem__ 25 26 27 class Foo: 28 29 def __getitem__(self, item): 30 pass 31 32 def __setitem__(self, key, value): 33 pass 34 35 def __delitem__(self, key): 36 pass 37 38 39 r = Foo() 40 41 #对象后面加方括号################################# 42 43 r['k'] #执行__getitem__ 44 45 r['k'] = '123' #执行__setitem__ 46 47 del r['k'] #执行__delitem__ 48 49 # #切片 ############################################### 50 51 r[1:3] #__getslice__(py2.7)/__getitem__(py3.5) 52 r[1:3] = [11,22,33] #__setslice__(py2.7)/ __setitem__(py3.5) 53 del r[1:3] #__delslice__(py2.7)/__delitem__(py3.5) 54 55 #迭代 __iter__ ############################################### 56 57 58 class Foo: 59 60 def __iter__(self): 61 yield 1 62 yield 2 63 yield 3 64 65 obj = Foo() 66 67 for i in obj: 68 print(i)
浙公网安备 33010602011771号