python基础学习(四)---面向对象编程

面向对象编程

面向对象编程的三个基础概念是数据封装(类)、继承和多态,在这三个记住概念的基础上,进一步扩展出更加高级的多重继承、定制类和元类等概念,这些概念和相关的功能使得python称为一种强大的面向对象的高级动态语言。

数据封装

面向对象编程中最重要的概念就是类和实例,类是对象的抽象的概念,而实例是对象的具象的结果。python中通过class关键字定义一个类,

class person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print("name: %s, age: %s" % (self.name, self.age))

laowang = person("laowang", 20)
laowang .show()
___________
输出:
name: laowang , age: 20

在类中为了代码安全性的要求,有些属性和方法不应该被外部直接获取到,需要对这些属性或方法设置访问限制,这一点和其他面向对象编程语言是一样的,即属性和方法有privatepublic的区分。在python不使用这两个关键字来设置访问权限,而是直接在属性名或函数名之前添加两个下划线__来表示这个属性是私有的属性,不允许外部直接修改,如果需要修改该属性,可以增加一个专门的函数用来修改该属性。

class person(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def show(self):
        print("name: %s, age: %s" % (self.__name, self.__age))
    def set_age(self, age):
        self.__age = age

qq = person("laowang", 20)
qq.show()
qq.set_age(90)
qq.show()
____________
输出:
name: laowang, age: 20
name: laowang, age: 90

设置的访问限制的属性无法通过类似qq.__age的形式直接访问,因为在解释器中它的名称已经被改变为qq._person__age,通过这一变量可以访问到该属性,但是并不建议这么做,因为不同版本的解释器的修改方法可能不一致,这会导致代码的不兼容,同时这么做也是不安全的。
如果在设置的访问限制之后,再直接使用__age强制的修改属性的内容,此时其实是新建了一个类的属性,原先类中的__age其实并未改变。

class person(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def show(self):
        print("name: %s, age: %s" % (self.__name, self.__age))
    def set_age(self, age):
        self.__age = age

qq = person("laowang", 20)
qq.show()
qq.__age = 50
qq.__age
qq.show()
qq.set_age(90)
qq.show()
————————————————————
输出:
name: laowang, age: 20
name: laowang, age: 20
name: laowang, age: 90

继承和多态

当我们新建一个类时,可以从一个现有的类上继承,这个新建的类被称为子类,这个被继承的类被称为子类的基类、父类或超类。
继承可以获得父类的全部功能,包括属性和方法,同时可以在此基础上进行添加新的属性和方法,或者重写原有的方法。同时,由于继承存在层层传递的关系,子类的实例,也是父类的实例,也是父类的父类的实例,以此类推,直到最上层的那个类,这也是为什么子类可以使用父类以及父类的父类中所定义的属性和方法,这也是由继承所导致的多态性,一个类可以具有包括其自身及所有父类的。
同时在使用子类,一定是先使用子类所定义的方法和属性,如果没有,才会去依次向上追溯寻找可用的属性或方法,如果直到最终的根类object都没有,才会爆错。

#!/usr/bin/python
# -*- encoding:utf-8 -*-

class person(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def show(self):
        print("name: %s, age: %s" % (self.__name, self.__age))
    def set_age
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值