Python 之 基础面向对象编程

来源:互联网 发布:b2b源码授权费用 编辑:程序博客网 时间:2024/05/16 07:20

注意:本文转自微信公众号 “Python互动中心”,觉得作者写的很好,我这边自己收藏学习。

1、面向对象编程

面向对象编程Object Oriented Programming简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数连续切分为子函数,即把大块函数切割成小块函数来降低系统的复杂度。

而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间的传递。

在Python中所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。

class Solution(object):    def __init__(self,name,score):        self.name  = name        self.score = score    def print_info(self):        print("This Student Name is %s , and He's Score is %d"%(self.name,self.score))if __name__ == "__main__":    Student = Solution('Python',99)    Student.print_info()    print(Student.name)    print(Student.score)



2、类和实例

 class 后面紧接着的是类名,即Solution,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

定义好了Solution类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的。

3、数据封装

类本身拥有数据和方法,相当于将“数据”封装起来。对于外部来说,并不需要知道内部逻辑

4、访问限制

Class可以有属性的方法,我们可以对属性和方法进行控制,以达到允许或者不允许外部访问的目的。如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以双下划线开头,就变成一个私有变量(Private),只有内部可以访问,外部不能访问。

class Solution(object):    def __init__(self,name,score):        self.__name  = name        self.__score = score    def print_info(self):        print("This Student Name is %s , and He's Score is %d"%(self.__name,self.__score))    def get_name(self):        return self.__name    def get_score(self):        return self.__score    def set_score(self,score):        if 0<= score <= 100:            self.__score = score        else:            raise ValueError('bad Score')if __name__ == "__main__":    Student = Solution('Python',199)    Student.print_info()    print(Student.get_name())    print(Student.get_score())    Student.set_score(199)


在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是Private变量,所以不能用__name_、__score__这样的变量名。

5、继承和多态

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(subclass),而被继承的class称为基类、父类或超类(Base Class、Super Class)。

class Animal(object):    def Base(self):        print('Please Call Me Animal...')    def Run(self):        print('Aniaml is Running...')class Dog(Animal):    def Run(self):        print('Dog is Running...')class Cat(Animal):    def Run(self):        print('Cat is Running...')animal = Animal()animal.Base()animal.Run()dog = Dog()dog.Base()dog.Run()cat = Cat()cat.Base()cat.Run()


当子类和父类都存在相同的Run()方法时,我们说,子类Run()覆盖了父类Run(),在代码运行的时候,总是会调用子类的Run(),这样,我们就获得继承的另一个好处:多态。在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行了。

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心的调用Run方法,而具体的Run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态的精髓:调用方只管调用,不管细节,而当我们新增一种Animal子类时,只要确保Run()方法编写正确,不管原来的代码如何调用。这就是著名的开闭原则。

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的外部函数。

6、鸭子类型

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者其它的子类,否则,将无法调用Run()方法。

对于像Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个Run()方法就可以了。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那么它就可以看做时鸭子。

7、实例属性和类属性

Python类创建的实例可以任意绑定属性,如果需要对类本身绑定属性,则需要在类中定义,这就区分了类属性和实例属性。

在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同的名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

原创粉丝点击