会飞的蝌蚪君

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

 

 

 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)

 

 

 

 

 

 

 

 

 

 

   

 

posted on 2018-01-31 19:09  会飞的蝌蚪  阅读(193)  评论(0)    收藏  举报