zoukankan      html  css  js  c++  java
  • day32--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property

    Python之路,Day19 = 面向对象的程序设计之继承实现的原理(继承顺序)、封装、property

     

    以下类容参考自:http://www.cnblogs.com/metianzing/p/7121947.html

     

    抽象类补充:

     1 import abc
     2 class Parent(metaclass= abc.ABCMeta):
     3     x=1
     4     @abc.abstractclassmethod
     5     def foo(self):
     6         pass
     7 
     8     @abc.abstractclassmethod
     9     def bar(self):
    10         pass
    11 
    12 class Child(Parent ):
    13     def foo(self):
    14         pass
    15 
    16     def bar(self):
    17         pass
    18 
    19 c=Child()
    20 print(c.x)
    21 运行结果:
    22 1

     注意1:父类的变量可以遗传给子类

     注意2:抽象类:本身不能被实例化,也不应该被实例化,它的作用就是定义标准,并不用具体实现。

    继承实现的原理(继承顺序)

    1 继承顺序

    继承
    新式类和经典类都会先找完一个分支(在多个父类没有共同父类的情况下)
    当父类出现共同父类的时候,新式类广度优先,经典类深度优先(到共同父类截止)

    继承顺序,可以通过 h.mro() 来查看,里面是个字典,
    # 这个方法只在新式类中有


    super()方法继承只能用于新式类
    super()方法继承只能用于新式类
    寻找顺序会按照 mro 中顺序找?怎么确定哪些属性给谁?
    ptyon 3
    super().__init__(name, age, sex)
    python 2
    super(子类,self).__init__(name, age, sex)

     封装:

     
    封装数据
    封装功能

      get/set方法的升级---版本一

     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # __author__ = "Always"
     4 # Date: 2017/7/2
     5 
     6 # propetry的使用
     7 
     8 class Test(object):
     9     def __init__(self):
    10         self.__num = 100
    11 
    12 
    13     def getNum(self):
    14         print("++++++++++++getNum++++++++++++")
    15         return self.__num
    16 
    17     def setNum(self, newNum):
    18         print("++++++++++++setNum++++++++++++")
    19         self.__num = newNum
    20 
    21     num = property(getNum, setNum)     # 位置参数(self, fget=None, fset=None, fdel=None, doc=None),get 在前面, set在后面
    22 
    23 t = Test()
    24 
    25 print(t.getNum())
    26 
    27 t.setNum(200)                       # 正常情况下,都是这么调用
    28 print(t.getNum())
    29 
    30 
    31 t.num = 50             # 使用 property 后,将get、set设置成了属性,这样的话,调用起来就比较方便了。可以直接使用
    32 
    33 print(t.num)
    34 
    35 get/set升级版本一

    get/set方法的升级---版本二

     1 # Date: 2017/7/2
     2 
     3 # propetry的使用
     4 
     5 class Test(object):
     6     def __init__(self):
     7         self.__num = 100
     8 
     9 # get写前面,set写后面,两个函数名字一样,函数名为后面的取值依据,个体前面写 property,set写 函数名.setter
    10     @property
    11     def num(self):
    12         print("++++++++++++getNum++++++++++++")
    13         return self.__num
    14 
    15     @num.setter
    16     def num(self, newNum):
    17         print("++++++++++++setNum++++++++++++")
    18         self.__num = newNum
    19 
    20     @num.deleter
    21     def num(self):
    22         print("++++++++++++deNum++++++++++++")
    23         del self.__num
    24 
    25 # 话句话说, 前面加 property 的时候,就把这个函数变成了一个属性(变量) 这样的话,代表可以直接执行
    26 # 这种情况下如果遇到有参数的时候,传参数可以参考 setter 这个赋值的操作,也就是,写两个咯。。。多试大兄弟
    27 t = Test()
    28 
    29 t.num = 50
    30 print(t.num)
    31 
    32 del t.num   # 通过这个可以删除 __num  这个私有属性
    33 
    34 # 上面就是三个属性的装饰器
    35 # 通常可以只提供一个查询的结果的接口给别人(这个函数里面可可以添加好多的流程)
    36 
    37 get/set升级版本二
  • 相关阅读:
    Java EE javax.servlet中的ServletContext接口
    Java EE javax.servlet中的ServletConfig接口
    MD5加密工具
    redis常见数据操作
    Java文件上传与下载
    JSP技术
    spring集成swagger
    freemarker模板引擎的使用
    log4j生成日志
    Java自定义注解
  • 原文地址:https://www.cnblogs.com/alwaysInMe/p/7123162.html
Copyright © 2011-2022 走看看