2018-07-09-Python全栈开发day26-多态、封装、反射

1.多态

  继承自同一父类的多个子类,除去子类间的差距之外,还有父类间相同的方法。

  

class Father:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def test(self):
        print('this is your father')

class Son1(Father):
    pass
class Son2(Father):
    pass

  两个类都有各自的属性,而且都继承同一个父类,所以也都有相同的父类属性可以调用。

2.封装

  个人的理解是为了隐藏代码,例如

  

class Test:
    def __init__(self,length,width,hight):
        self._length=length
        self._width=width
        self._hight=hight
    def area(self):
        return self._length*self._width
    def cube(self):
        return self._width*self._length*self._hight
p1=Test(4,5,6)
print(p1.area())
print(p1.cube())

  通过对参数前加_,就是私有属性,约定俗成无法访问,但是还是可以强制访问。使使用者无法直接调用length、width、hight属性,只能根据提供的area、cube方法来得到特定的值,而不能得到具体的。

  但是只是在参数前加一个_的话,依然是可以访问

  2.2 __test

    

class Test:
    def __init__(self,length,width,hight):
        self.__length=length
        self.__width=width
        self.__hight=hight
    def area(self):
        return self.__length*self.__width
    def cube(self):
        return self.__width*self.__length*self.__hight
p1=Test(4,5,6)
print(p1.area())
print(p1.cube())
print(p1._Test__length)

    虽然这种方法约定了是私有属性无法直接通过P1.__LENGTH访问,但是python只是给其改了一个名字而已,依然可以通过p1._Test__length来访问

  2.3 自省/反射

    自省的定义就是对自身属性的操作

    2.3.1 hasattr(obj,'name'):查看obj对象中是否有name方法,返回true or false

      

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def length(self):
        print('this is length')
p1=Test('alex',18)
print(hasattr(p1,'name'))

  2.3.2  getattr(obj,'name',’找不到返回的值‘):查看obj对象中‘name’对应的值,如果没有这个方法,则返回第三个参数

    

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def length(self):
        print('this is length')
p1=Test('alex',18)
print(getattr(p1,'name','错误返回值'))
print(getattr(p1,'alex','错误返回值'))

alex
错误返回值

  2.3.3 setattr(obj,'key','value'):对obj对象的key属性进行新增和更改

    

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def length(self):
        print('this is length')
p1=Test('alex',18)
setattr(p1,'name','yehaibin')
print(getattr(p1,'name','错误返回值'))
print(getattr(p1,'alex','错误返回值'))
--
yehaibin
错误返回值

  2.3.4 delattr(obj.'name'):删除obj下的name属性

    

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def length(self):
        print('this is length')
p1=Test('alex',18)
delattr(p1,'name')
print(getattr(p1,'name','错误返回值'))
print(getattr(p1,'alex','错误返回值'))
--
错误返回值
错误返回值

 3.补充 __import__

  在普通的导入模块中,使用import可以直接导入,但是如果是字符串的话,有两种导入方式

  3.1 __import__

     __import__(’m.test‘)

      使用这种方法导入只能导入m,而不能导入test,导入的路径可以是字符串

  3.2 importlib

    import importlib

    m=importlin.import_module('m1.test')

    此时导入的就是test模块

      

猜你喜欢

转载自www.cnblogs.com/hai125698/p/9286565.html
今日推荐