python面向对象编程基本规则

Agenda

面向对象思想

类的定义

属性

  属性修饰器

方法

  操作符重载

继承和多态

  封装、继承、多态

 

面向过程、面向对象、面向函数

 

面向对象的思想,用类和对象对现实世界进行抽象

类:对事物的抽象

对象:是类的一个实例

 

类的组成:有变量和函数组成(属性、方法)

变量:属性、成员属性、是对数据的封装

函数:方法、成员方法、是对行为的封装

 

对象的组成:对象是由类实例化后得到的,所以也由属性和方法组成

 

面向对象的3大特点

  封装、继承、多态

 

类的定义

  class关键字定义类,类的首字母大写,习惯问题

  类内有属性和方法

  class Dog():

    属性定义

    方法定义

  调用类型  变量名=类名()

1 class Dog():
2     pass
3 wangcai=Dog()
4 print wangcai
View Code

  经典类

    类型

  新式类

    __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)
View Code

 

定义类

  属性:数据封装

    类属性

      类共同拥有的属性,类中定义

      放到类中记录

    实例属性

      类中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
View Code

访问属性

  直接访问

  自定义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
View Code

 

方法

  实例方法: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'
View Code

运算符重载

  构造函数、析构函数

    __new__\__init__\__del__

  四则运算:+-*/

    __add__\__sub__\__mul__\__div__

  比较运算

    __lt__\__gt__\__cmp__

  其他

    __str__\__repr__\__contains__\__bool__

 

 

继承和多态

继承

  根据已有的类,定义新的类

  继承的目的:代码重用、多态

  调用父类的方法:父类.方法名(self);super(子类名,self).方法名()

多重继承

菱形继承问题

  经典类:深度优先

  新式类:广度优先

  super.(子类名.self)

 

实现向量的加乘

  加常量

  两个向量相加

  乘常量

  两个向量相乘

  两个向量的点集

posted @ 2017-02-21 10:15  阅学习乐  阅读(157)  评论(0)    收藏  举报