# 一。为对象定制属性 # 例一 # class OldboyStudent: # school='oldboy' # # def choose_course(self): # print('is choosing course') # # stu1=OldboyStudent() # stu2=OldboyStudent() # stu3=OldboyStudent() #对象的本质就是一个名称空间而已,对象名称空间是用来存放对象自己独有的名字|属性, # 而类中存放的是对象们共有的属性 # print(stu1.__dict__) # print(stu2.__dict__) # print(stu3.__dict__) #还没有内容是一个空的字典,空的名称空间 # stu1.name='耗哥' # stu1.age=18 # stu1.sex='male' # # stu2.name='猪哥' # stu2.age=28 # stu2.sex='male' # # stu3.name='帅翔' # stu3.age=18 # stu3.sex='male' # # print(stu1.name,stu2.age,stu3.sex) # print(stu1.__dict__) # 例二 # class OldboyStudent: # school='oldboy' # # def choose_course(self): # print('is chossing course') # # stu1=OldboyStudent() # stu2=OldboyStudent() # stu3=OldboyStudent() # # def init(obj,x,y,z): # obj.name=x # obj.age=y # obj.sex=z # # stu1.name='耗哥' # stu1.age=18 # stu1.sex='male' # init(stu1,'耗哥',18,'male') # # stu2.name='猪哥' # stu2.age=18 # stu2.sex='male' # init(stu2,'猪哥',18,'male') # # stu3.name='帅翔' # stu3.age=18 # stu3.sex='male' # init(stu3,'帅翔',19,'male') # # print(stu1.__dict__) # print(stu2.__dict__) # print(stu3.__dict__) # 例三。 class OldboyStudent: school='oldboy' def __init__(self,x,y,z): self.name=x self.age=y self.sex=z def choose_course(self): print('is choosing course') # 调用类时发生两件事 # 1.创造一个空的对象stu1 # 2.自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入 stu1=OldboyStudent('耗哥',18,'male')#OldboyStudent.__init__(stu1,'耗哥’,18,'male') stu2=OldboyStudent('猪哥',19,'male') stu3=OldboyStudent('帅翔',19,'male') print(stu1.__dict__) print(stu2.__dict__)
print(stu3.__dict__)
# 二。属性查找。 class OldboyStudent: school='oldboy' count=0 def __init__(self,x,y,z): self.name=x self.age=y self.sex=z OldboyStudent.count+=1 def choose_course(self): print('is choosing course') #先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错 stu1=OldboyStudent('耗哥',18,'male') stu2=OldboyStudent('猪哥',19,'male') stu3=OldboyStudent('帅翔',20,'male') print(OldboyStudent.count) print(stu1.count) print(stu2.count) print(stu3.count)
# 三。绑定方法 class OldboyStudent: school='oldboy' def __init__(self,x,y,z): self.name=x self.age=y self.sex=z def choose_course(self): print('%s is choosing course'%self.name) def func(self): print('年纪%s'%self.age) #类名称空间中定义的数据属性和函数属性都是共享给所有对象用的 #对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性 stu1=OldboyStudent('耗哥',18,'male') stu2=OldboyStudent('猪哥',19,'male') stu3=OldboyStudent('帅翔',29,'male') print(stu1.name) print(stu2.school) #类中定义的函数是类的函数属性,类可以使用,但是用的就是一个普通的函数而已, # 意味这需要完全遵循函数的参数规则,该传几个值就传几个值 print(OldboyStudent.choose_course) # OldboyStudent.choose_course(12) # 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的, # 绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作的第一个参数自动传入 print(id(stu1.choose_course)) print(id(stu2.choose_course)) print(id(stu3.choose_course)) # 通过类绑定函数,id的值是一样的 print(id(stu1.school)) print(id(stu2.school)) print(id(stu3.school)) #id 的值是一样的 print(id(stu1.name),id(stu2.name),id(stu3.name)) #属于不同的对象空间所以id的值也不同 stu1.choose_course() stu2.choose_course() stu3.choose_course() #对象当作参数传给choose_course函数 stu1.func() # 补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定 # 给对象用的,所以在类中定义的函数都应该自带一个参数self
四。#在python3中统一了类与类型的概念,类就是类型 class OldboyStudent: school='oldboy' def __init__(self,x,y,z): self.name=x self.age=y self.sex=z def choose_course(self,x): print('%s is choosing course'%self.name) stu1=OldboyStudent('耗哥',18,'male') stu1.choose_course(1)#OldboyStudent.choose_course(stu1,1) OldboyStudent.choose_course(stu1,1) l=[1,3,5]#l=lise([1,2,3]) print(type(l)) print(type(stu1)) l.append(4)#list.append(l,4) list.append(l,4) print(l) #其实list ,dict,等都是类,这个l就是对象,append 就相当与 类中的函数
# 五,类与对象的总结 # 对象是一个高度整合的产物,整合数据与专门操作该数据的方法(绑定方法) class foo: def __init__(self,host,port,db,chartset): self.host=host self.port=port self.db=db self.chart=chartset def excl(self,sql): conn=connect(self.host,self.port,self.db,self.chartset) conn.execute(sql) def excl2(self,proc_name): conn=connect(self.host,self.port,self.db,self,chartsett) conn.call_proc(sql) return xxx class Bar: def __init__(self,x,y,z,a,b,c): self.x=x self.y=y self.z=z self.a=a self.b=b self.c=c def exc4(self,xxx): pass def exc4(self,yyy): pass obj1=foo('12',3304,'db1','utf-8') obj1.excl('select*from t1') obj1.excl('selext*from t2') obj1.excl('selext*from t3') obj2=foo('1.2.43',3306,'db1','utf-8') obj2.excl('select*from t4')
# 六。继承与派生 # 1、什么是继承 # 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 # 继承的特性是:子类会遗传父类的属性 # 强调:继承是类与类之间的关系 # # 2、为什么用继承 # 继承的好处就是可以减少代码的冗余 # # 3、如何用继承 # 在python3中支持一个类同时继承多个父类 # 在python3中 # 如果一个类没有继承任何类,那默认继承object # 在python2中 # 如果一个类没有继承任何类,那么不会继承object # # 新式类 # 但凡继承了object的类以及该类的子类,都是新式类 # 经典类 # 没有继承object的类以及该类的子类,都是经典类 # # 在python3中都是新式类,只有在python2中才区别新式类与经典类 class Parent1(object): pass class Parent2(object): pass class Sub1(Parent1,Parent2): pass print(Sub1.__bases__) print(Parent2.__bases__) print(Parent1.__bases__)
# 七,继承的应用 # # 派生:子类中新定义的属性,子类在使用时始终以自己为准 class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name#teal.name='egon' self.age=age#teal.age='egon' self.sex=sex#teal.sex='male' class OldboyStudent(OldboyPeople): def choose_coure(self): print('%s is choosing course'%self.name) class OldboyTeather(OldboyPeople): #teal,'egon',18,'male',10 def __init__(self,name,age,sex,levenl): #self.name=name #self.age=age #self.sex=sex OldboyPeople.__init__(self,name,age,sex)#1.指明道姓的访问某一个类的函数,该方式与继承无关 self.levenl=levenl def score(self,stu_obj,num): print('%s is scoring'%self.name) stu_obj.score=num#为传入的stu1传值, stu1=OldboyStudent('耗哥',18,'male') teal=OldboyTeather('egon',19,'male',10) #对象查找属性的顺序:对象自己———》对象的类——》父类——》父类。。 print(stu1.school) print(teal.school) print(stu1.__dict__) print(teal.__dict__) teal.score(stu1,99)#运行内部的score函数 print(stu1.__dict__) print(stu1.score)#得到的值为99 #在子类派生出的新功能中重用父类功能的方式有两种 #1.指明道姓的访问某一个类的函数,该方式与继承无关 class Foo: def f1(self): print('foo.f1') def f2(self): print('foo.f2') self.f1() class Bar(Foo): def f1(self): print('Bar.f1') obj=Bar() obj.f2() #foo.f2 #Bar.f1 #对象查找顺序, 对象自己——》对象的类——》父类——》父类。。。。