封装、继承、多态
一、对象
- 1、基本格式
# 定义类class SQLHelper:# 定义方法def fetch(self,host,username,password,sql): //self参数必须由,由python去自动传值,其他参数接受用户传入的“实际数据”passdef create(self,host,username,password,sql):passdef remove(self,host,username,password,sql):passdef modify(self,host,username,password,sql):pass
# 实例化obj = SQLHelper()# 方法调用obj.remove("1.1.1.1","user1","123","select * from db1")
- 对象指针:
- 实例化对象:实际上是,对象内部的”对象指针“指向了创建该对象的类
- 执行方法 :实际上是,对象内部的”对象针指“向了类中的方法,并给予执行
- 问题:
- 此时,执行每个方法,都需要传很多参数
- 2、对象的封装(变量赋值):
# 类定义class SQLHelper:def fetch(self,sql):# 利用 self.hhost ,self.uusername, self.pwd 链接数据库# 执行sqlpassdef create(self,sql):# 利用 self.hhost ,self.uusername, self.pwd 链接数据库# 执行sqlpass
# 实例化obj = SQLHelper()# 封装数据给对象obj.hhost = "1.1.1.1"obj.uusername = "user1"obj.pwd = "123"# 方法调用obj.fetch('select * from db1')obj.create('create db1')
- python将obj名称传递给self参数:
- 此时,self表示实例化出的对象,即此时可在方法内部通过self来获取该对象属性的值
- 因此,在方法调用之前,只需要将实例化出的对象封装一遍(通用的变量进行赋值),所有的方法在类内部就可使用self来获取些通用数据
- 问题:
- 不同的对象需要封装不同的数据,因此,若要连接几十个DB,则需要封装几十次初始化数据
- 2.2、构造方法
- __init__() 方法称为构造方法,python在实例化对象时,会自动执行该方法
# 定义类class SQLHelper:# 方法def __init__(self,args1,args2,args3):self.hhost = args1self.uusername = args2self.pwd = args3
def fetch(self,sql):# 连接数据库# 执行sql语句pass# 实例化obj1 = SQLHelper('1.1.1.1','user1','redhat') // 实例化一个对象,并封基础装数据给该对象obj2 = SQLHelper('2.2.2.2','user1','redhat')# 调用obj1.create('create db1') //直接调用方法obj2.create('create db1')
- 2.3、对象封装对象:
- 可以封装任意类型数据的,对象中,可以封装多层,相当于嵌套,对象中封装对象
# 定义
class c1:def __init__(self,name,obj):self.name = nameself.obj = objclass c2:def __init__(self,name,age):self.name = nameself.age = age
# 实例化c2_obj = c2('bb',11)c1_obj = c1('aa',c2_obj) # 将一个对象封装进本对象中
- 解释:
- 此时,c1_obj.obj 代表的是 c2_obj,c1_obj.obj.age 则为11
二、类继承:
- 查找顺序为一条道走到黑再走下一条,若有共同父类,则最后查找共同父类
- 1、单继承
# 父类、基类class F1:def show(self):print('show')
# 子类、派生类class F2(F1): //表示F2继承F1 ,继承F1中方法 相当于在F2中加了一段父类中的代码(就是这样,绕的时候直接代码贴过去看)def bar(self):print('bar')def show(self):print('show')
# 实例化、调用obj = F2()obj.show()
- 优先级:
- 若子类中方法和父类中方法冲突,则子类中优先级较高,即会执行子类中方法
- 即,对于obj的每次方法调用,都应该先从自己的类中找
- 2、多继承
# 父类1class c1:def f1(self):pass# 父类2class c2:def f2(self):pass# 子类class c3(c2,c1): //继承2个父类,且若父类中有方法冲突(方法名称一样),则写在前面的父类优先级高def f3(self):pass
- 优先级
# 父类中没有共同祖先1、在本身类中找2、在第一个父类中找3、在父类的父类中递归找4、若还找不到,则最后找第二个父类
# 父类中有共同祖先:1、在本身类中找2、在第一个父类中找3、在父类的父类中递归找,在共同父类前停止,开始递归第二个父类4、若还找不到,则最后找第二个父类
- 注意:
- 通过class定义类,在类中自定义方法,和python内置类 list , str, tuple, dict,是一样样的
class Foo:def ...obj = Foo() //则类型为Foo类型
三、类多态
- python 本身就支持多态
def function(arg):print(arg)func(1)func([1,2,3])传入的参数可以是任意类型,字串、列表等
- 其他语言需要指定变量类型,即参数只能是一种形态
def func(int arg)
- 其他语言若想要多态
# java 要多态class A:passclass B:passclass C:pass
def func(A arg): //arg类型为A类型或A的子类型,即 多态pass