python的面向对象

# 一。为对象定制属性
# 例一

# 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
#对象查找顺序, 对象自己——》对象的类——》父类——》父类。。。。

猜你喜欢

转载自blog.csdn.net/qq_35540539/article/details/80820742