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模块