• Python面向对象(其一)



    python 面向对象(其一)

    面向对象基本释义

    • 对象: 具有一系列属性方法的集合
    • 举例:

      ---------------------------------------
                        同学小明
      --------------------属性----------------
      名字: 小明
      父亲:(未知)
      母亲:(未知)
      性别:男
      年龄:15   
      --------------------方法----------------
      滚出去: 调用此方法可以让小明滚出教室
      闭嘴: 调用此方法可以让小明闭嘴
      告密:(仅老师可用)
      写给阿花从未寄出去的表白信:(仅自己可知)
    • 属性说明:

      • 小明的名字、年龄、性别,对外可见,就是public属性;
      • 小明的父亲、母亲对外不可见,只有小明知道,这个就是private属性;
      • 如果小明还有兄弟姐妹,那么父亲、母亲这两个属性对兄弟姐妹父母都是可见的,这个就是protected属性,即有选择范围的对外可见
        • 一般情况下指的是同一个package范围
    • 方法说明:
      • 滚出去、闭嘴这两个是任何人可以对小明进行调用的方法,默认public
      • 告密是只有指定的人才可以调用,即选择性开放,一般为proteced
      • 从未寄出去的表百姓,就是私有方法,除了自己谁都不知道,private

    说明:
    1. Python中默认是没有proteced属性的,而且共有私有之间隔离并不是完全绝对
    2. Python中所有类型默认都是对象形式组织

    面向对象在类中的体现

    上面说的小明,用代码表述出来就是:

     1 #! coding:utf-8
     2 # object是对象类,也是python种一切对象的父类;所有的类型都显示/隐式的继承自object
     3 # 平时使用时,可以直接写class XiaoMing
     4 class XiaoMing(object):
     5 
     6     name = "小明"
     7     age = 15
     8     gender = ""
     9 
    10     __father = "father_of_xiaoming"
    11     __mother = "mother_of_xiaoming"
    12 
    13     def __init__(self, relationship):
    14         self.relationship = relationship
    15 
    16     def goOut(self):
    17         '''
    18             小明滚出去
    19         '''
    20         print "Xiaoming, your %s let you go out"%self.relationship
    21 
    22     def shutUp(self):
    23         '''
    24             小明闭嘴
    25         '''
    26         print "Xiaoming, your %s let you shut up"%self.relationship
    27 
    28     # python没有proteced,默认为同一个package可以直接调用
    29     def gaoMi(self):
    30         '''
    31             告密
    32         '''
    33         pass
    34 
    35     #私有方法,开头方式是这样
    36     def __sayLove(self):
    37         '''
    38             写一封不敢寄出去的情书,唉,少年应许多情
    39         '''
    40         print "%s, you should not watch it!"%self.relationship

    小明这个类的使用过程是这样的

    #实例化一个对象
    xiaoming = XiaoMing("dude")
    print xiaoming.name
    print xiaoming.age
    print xiaoming.gender
    xiaoming.goOut()
    xiaoming.shutUp()
    xiaoming.gaoMi()
    
    # ======output======== #
    # 小明
    # 15
    #
    # Xiaoming, your dude let you go out
    # Xiaoming, your dude let you shut up

    Python中对象的应用

    在python中可以通过dir(obj)来查看每个对象当前可用的属性和方法,如:

    print dir(xiaoming)
    
    # ======output======== #
    #['_XiaoMing__father', '_XiaoMing__mother', '_XiaoMing__sayLove', '__doc__', '__init__', '__module__', 'age', 'gaoMi', 'gender', 'goOut', 'name', 'relationship', 'shutUp']

    上面例子中,注意_XiaoMing__father_XiaoMing__mother,这两个属性为私有变量__father、__mother的外部调用方式,如下:

    print xiaoming._XiaoMing__father
    # ======output======== #
    # father_of_xiaoming

    python中一切皆对象,凡是对象都可以用dir(obj)来查看属性方法,可以试试

    类继承与重构

    小明长大变超人了!

        ---------------------------------------
                          超人小明
        --------------------属性----------------
        年龄:30   
        必杀技:镭射光线!biubiu!
        --------------------方法----------------
        滚出去: 谁敢叫本超人滚出去,站出来试试!
        告密:已经不需要告密了
        写给老婆阿芳的家信:暗恋的人最终没有成为自己的老婆啊
    • 属性说明:
      • 超人小明仍然具备同学小明的一切属性,除了年龄在长大
      • 超人小明有了自己的必杀技,毕竟是超人嘛
    • 方法说明:
      • 滚出去:现如今哪个不怕死的敢让超人滚出去
      • 告密:那些黑历史怎么可能重提
      • 写给老婆阿芳的家信:心里也继续暗恋阿花,但毕竟有了自己的老婆了

    如上,超人小明是同学小明后续的一个可能,也就是扩展子类,用代码描述为:

    #! coding:utf-8
    class SuperManXiaoMing(XiaoMing):
    
        action = "镭射光线!biubiu!"
        def __init__(self, relationship):
            super(SuperManXiaoMing, self).__init__(relationship)
            self.age = 30
    
        def goOut(self):
            print "现如今哪个不怕死的敢让超人滚出去! %s 你小子活腻歪了是吧!"%self.relationship
    
        def gaoMi(self):
            pass
    
        def loveToWife(self):
            print "阿芳,额想你!"

    调用的例子为:

        superman = SuperManXiaoMing("dude")
        print superman.name
        print superman.age
        print superman.gender
        print superman.action
        superman.goOut()
        superman.shutUp()
        superman.gaoMi()
        superman.loveToWife()
    
        print dir(superman)
        print superman._XiaoMing__father
    # ======output======== # # 小明 # 30 # # 现如今哪个不怕死的敢让超人滚出去! dude 你小子活腻歪了是吧! # Xiaoming, your dude let you shut up # 阿芳,额想你! # ['_XiaoMing__father', '_XiaoMing__mother', '_XiaoMing__sayLove', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'action', 'age', 'gaoMi', 'gender', 'goOut', 'loveToWife', 'name', 'relationship', 'shutUp'] # father_of_xiaoming

    看,上述输出中,gaoMi没有输出,因为被pass了。其他父类子类的内容全在里面了。

    思考1

    • 掌握上述知识可以做什么?
    • 继承父类,super(className, self).init() 和 ParentClass.init()区别是什么?
    • 类的使用场景有哪些?
    • 对测试而言,类的好处与不好处有哪些?
  • 相关阅读:
    模型命名规范
    Jquery 将表单序列化为Json对象
    Failed to read auto-increment value from storage engine错误的处理方法
    css样式表中设置table的第一列的宽度是固定值
    thinkphp中I("parm")用法的注意事项
    获取凌晨00:00:00的时间
    php empty()和isset()的区别
    react续集
    react的笔记整理
    vuex
  • 原文地址:https://www.cnblogs.com/SilenceCity/p/pythonOO1.html
Copyright © 2020-2023  润新知