大小孩

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

本节内容

1.面向过程VS面向对象
2.面向对象
1.Class类(模版)
2.构造与析构函数
3.类变量与实例变量
4.Object对象
5.Encapsulation封装
6.Inheritance继承
7.Polymorphism多态
8.静态方法
9.类方法
10.属性方法
11.类的特殊成员方法
3.反射

一、面向过程VS面向对象

(1) 编程

语法+数据结构+算法组合成的代码

(2) 编程范式

本质上代表针对各种类型的任务采取不同的解决问题思路。
  • 面向过程(Procedual Programming)
    - Use a list of instruction to tell computer what to do(使用一系列指令告诉计算机要做什么)
    - step-by-setp
    - 适用于写简单的脚本,做一些一次性的任务
  • 面向对象OOP(Object-Oriented Programming)
    - 适用于复杂的、且需要不断迭代和维护的任务

(3) 面向对象优点

  • 程序的维护和扩展更简单
  • 大大提高程序开发效率
  • 使人更容易理解代码逻辑

二、面向对象

1、Class类(模版)

对一类拥有相同属性对象的抽象、蓝图、原型
类中定义类这些对象都具备的属性、共同的方法
Object是类的一个实例,类是type类的一个实例

2、构造与析构函数

  • 构造函数,__init__(self[,形参])
    实例化时做一些初始化的工作
  • 析构函数,__del__(self)
    实例释放、销毁的时候执行,通常做一些收尾工作,如关闭一些数据库连接,打开的临时文件(Python会自动调用析构函数)。

3、类变量与实例变量

实例取变量先在实例本身中找,若找不到再去类中找
  • 类变量
    作用域是所有实例,节省开销
  • 实例变量
    也叫静态属性,作用域是实例本身

4、Object对象

一个对象即使一个类实例化后的实例

5、Encapsulation封装

在类中对数据的赋值、内部调用等操作对外部用户来说是透明的,这使类成了一个容器或胶囊,里面包含着类的数据和方法。
#类class  
class dog:  
    n = 123        #类变量  
    def __init__(self,name):  
        ''' 
        构造函数,在实例化时做一些类的初始化的工作 
        :param name: 
        '''  
        self.name = name        #d1.name=name实例变量(静态属性),作用域就是实例本身  
      
    def bulk(self):             #类的方法、功能 (动态属性)  
        print("%s: wang wang wang !"%self.name)  
      
#对象object  
d1 = dog("dog1")  
d2 = dog("dog2")  
d3 = dog("dog3")  

6、Inheritance继承

一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承(代码的重用)
除了继承方式可以代码重用外,还可用组合的方式,将object传给类中的类变量,如:
self.people = People(self,name,age)  
继承顺序:
  • 广度优先:先从继承的父类中,按照从左到右的顺序,依次去父类中查找。若没有找到,再去父类的父类中查找,依次向上
  • 深度优先:先从继承的最左侧的父类中查找,若没有找到,再去父类的父类中查找,依次向上。若到最顶层类也查不到,按照从左到右顺序再去继承的第二个父类中查找,重复上述过程…
注意:
  • Python2 经典类是按照深度优先来继承的,新式类是按照广度优先来继承的
  • Python3 经典类和新式类都按照广度优先来继承
# class People:                     "经典类"  
class People(object):               #"新式类",推荐写法  
    def __init__(self,name,age):  
        self.name = name  
        self.age = age  
        self.friends = []  
        print("--doens't run ")  
    def eat(self):  
        print("%s is eating..." % self.name)  
    def talk(self):  
        print("%s is talking..." % self.name)  
    def sleep(self):  
        print("%s is sleeping..." % self.name)  
      
class Relation(object):  
    def __init__(self,n1,n2):  
        print("init in relation")  
    def make_friends(self,obj): #w1  
        print("%s is making friends with %s" % (self.name,obj.name))  
        self.friends.append(obj.name)  
      
      
class Man(Relation,People):              #多继承
    # def __init__(self,name,age,money):        #重构父类构造函数  
      
    #     #People.__init__(self,name,age)       #"经典类"写法  
    #     super(Man,self).__init__(name,age)    #"新式类"写法,推荐写法  
      
    #     self.money  = money  
    #     print("%s 一出生就有%s money" %(self.name,self.money))  
      
    def piao(self):  
        print("%s is piaoing ..... 20s....done." % self.name)  
      
    def sleep(self):                #重构父类方法  
        People.sleep(self)  
        print("man is sleeping ")  
      
      
class Woman(People,Relation):  
    def get_birth(self):  
        print("%s is born a baby...." % self.name)  
      
m1 = Man("NiuHanYang",22)  
# w1 = Woman("ChenRonghua",26)  
#  
# m1.make_friends(w1)  
# w1.name = "陈三炮"  
# print(m1.friends[0])  

7、Polymorphism多态

重要特性(一个接口,多种实现)
指一个基类中派生出不同的子类,子类不仅继承里父类同样的方法名,同时也可以对父类的方法做不同的实现

8、静态方法

在方法前加@staticmethod,方法就变成了一个普通函数,只不过需要通过类名或者实例名来调用,不能调用 类的self。只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
class Dog(object):  
    def __init__(self,name):  
        self.name = name  
     
    @staticmethod #实际上跟类没什么关系了  
    def eat(self):  
        print("%s is eating %s" %(self.name,'dd'))  
      
    def talk(self):  
        print("%s is talking"% self.name)  
d = Dog("ChenRonghua")  
d.eat(d)  
d.talk()

9、类方法

在方法前加@classmethod,只能访问类变量,不能访问实例变量
class Dog(object):  
    #n = 333  
    #name = "huazai"  
    def __init__(self,name):  
        self.name = name  
        #self.n  = 333  
         
    @classmethod            #只能访问类变量,不能访问实例变量  
    def eat(self):  
        print("%s is eating %s" %(self.name,'dd'))  
      
    def talk(self):  
        print("%s is talking"% self.name)  
      
d = Dog("ChenRonghua")  
d.eat()  
      
''''' 
AttributeError: type object 'Dog' has no attribute 'name' 
''' 

10、属性方法

在方法前加@property,把方法变成一个静态属性(实例变量)
class Dog(object):  
    '''''这个类是描述狗这个对象的'''  
    def __init__(self,name):  
        self.name = name  
        self.__food = None  
     
    @property       #attribute  
    def eat(self):  
        print("%s is eating %s" %(self.name,self.__food))  
    @eat.setter     #传参  
    def eat(self,food):  
        print("set to food:",food)  
        self.__food = food  
    @eat.deleter    #删除  
    def eat(self):  
        del self.__food  
        print("删完了")  
      
    def talk(self):  
        print("%s is talking"% self.name)  
      
    def __call__(self, *args, **kwargs):  
        print("running call",args,kwargs)  
      
    def __str__(self):  
        return "<obj:%s>" %self.name  
      
#print(Dog.__dict__) #打印类里的所有属性,不包括实例属性  
d = Dog("ChenRonghua")  
print(d)  
# print(d.__dict__) #打印所有实例属性,不包括类属性  
# d(1,2,3,name=333)  
      
#Dog("ChenRonghua")() 

11、类的特殊成员方法

详细使用参考 http://www.cnblogs.com/alex3714/articles/5213184.html
__doc__     #类的描述信息  
__module__  #当前操作的对象在哪个模块  
__class__   #当前操作对象类名  
__init__    #构造函数  
__del__     #析构函数  
__call__    #在类中加入,类就可以调用。调用方法:对象后加()  
__dict__    #class_name.__dict__或object_name.__dict__,以字典的形式打印类或实例下所有的方法、属性  
__str__     #如果在类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值  
__getitem__ #  
__setitem__ #  
__delitem__ #用于索引操作,如字典。以上分别表示获取、设置、删除数据 
__new__     #用来创建实例的  
__metaclass #用来表示该类由谁来实例化创建  

三、反射

通过字符串映射或修改程序运行时的状态、属性、方法(变量)
def bulk(self):  
    print("%s is yelling...." %self.name)  
      
class Dog(object):  
    def __init__(self,name):  
        self.name = name  
      
    def eat(self,food):  
        print("%s is eating..."%self.name,food)  
      
      
d = Dog("NiuHanYang")  
choice = input(">>:").strip()  
      
if hasattr(d,choice):       #判断对象中是否有字符串对应的方法  
    getattr(d,choice)       #获取方法或变量内存地址  
else:  
    setattr(d,choice,bulk)      #(object,attribute,value),相当于d.talk = bulk  
    func = getattr(d, choice)  
    func(d)  
          
#delattr(d,choice)     #(object,attribute)  

参考:

http://www.cnblogs.com/alex3714/articles/5188179.html
http://www.cnblogs.com/alex3714/articles/5213184.html
posted on 2017-12-20 22:49  大小孩  阅读(141)  评论(0)    收藏  举报