Python 之 基础面向对象编程

注意:本文转自微信公众号 “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类创建的实例可以任意绑定属性,如果需要对类本身绑定属性,则需要在类中定义,这就区分了类属性和实例属性。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值