python笔记(六)

来源:互联网 发布:淘宝判断虚假交易 编辑:程序博客网 时间:2024/05/02 04:57


对象的优越性体现在:封装  继承   包含  


class <类名>(父类名):

          pass                                              class语句末尾要有一个‘:’   没有父类的时候可以不写括号


最简单的类:

class Myclass:

     pass                                                              也会自动继承内建的类Object


class MyClass:
    "MyClass help."
    
myclass = MyClass()
print('输出类说明:')
print(myclass.__doc__)
print('显示类帮助信息:')
help(myclass)

类的方法:

方法的第一个参数必须是self,且不可省略                   方法调用时不提供self参数

方法的调用需要实例化类,并以实例名.方法名(参数列表)形式调用

整体进行一个单位的缩进,表示其属于类体中的内容


类中方法调用方法:self.方法名(参数列表)


类的属性有两类:

实例属性:属于某一个实例具体化 与别的实例之间数据互不干扰

类属性:只要有一个实例修改了类属性,在别的实例中也会随之改变

class Demo_Property:
    class_name = "Demo_Property"


    def __init__(self,x=0):
        self.x = x


    def class_info(self):
        print('类变量值:',Demo_Property.class_name)
        print('实例变量值:',self.x)


    def chng(self,x):
        self.x = x


    def chng_cn(self,name):
        Demo_Property.class_name = name


dpa = Demo_Property()
dpb = Demo_Property()
print('初始化两个实例')
dpa.class_info()
dpb.class_info()
print('修改实例变量')


print('修改dpa实例变量')
dpa.chng(3)
dpa.class_info()
dpb.class_info()
print('修改dpb实例变量')
dpb.chng(10)
dpa.class_info()
dpb.class_info()
print('修改类变量')
print('修改dpa类变量')
dpa.chng_cn('dpa')
dpa.class_info()
dpb.class_info()


print('修改dpb实例变量')
dpb.chng_cn('dpb')
dpa.class_info()
dpb.class_info()


python不含有私有属性和方法,通常用__双下划线的名称来标识,以养成良好的编程习惯


@staticmethod:静态方法:无法访问类属性,实例属性,相当于一个独立的方法,跟类其实没什么关系,其实质就是放在类作用域里面的一个函数

@classmethod:类方法:可以访问类属性,无法访问实例属性。但由于实例对象可以调用类属性,所以两者容易混淆。


类的继承:可以连构造 函数一起继承,可以通过重载函数来实现功能的变换,添加新的函数来完成新的功能

多重继承:

class PrntA:


    namea = 'PrntA'
    def set_value(self,a):
        self.a = a


    def set_namea(self,namea):
        PrntA.namea = namea


    def info(self):
        print('PrntA:%s,%s' % (PrntA.namea,self.a))


class PrntB:


    nameb = 'PrntB'


    def set_nameb(self,nameb):
        PrntB.nameb = nameb


    def info(self):
        print('PrntB:%s' % (PrntB.nameb,))


class Sub(PrntA,PrntB):
    pass


class Sub2(PrntB,PrntA):
    pass


class Sub3(PrntA,PrntB):


    def info(self):
        PrntA.info(self)
        PrntB.info(self)
        
print('使用第一个子类:')
sub = Sub()
sub.set_value('aaaa')


sub.info()
sub.set_nameb('BBBB')


sub.info()
print('使用第二个子类:')
sub2= Sub2()
sub2.set_value('aaaa')


sub2.info()
sub2.set_nameb('BBBB')


sub2.info()
print('使用第三个子类:')
sub3= Sub3()
sub3.set_value('aaaa')


sub3.info()
sub3.set_nameb('BBBB')


sub3.info()


当父类不止一个时,考虑广度优先的继承,调整继承顺序:

class Ant():


    def __init__(self,x=0,y=0,color='black'):
        self.x=x
        self.y=y
        self.color=color


    def crawl(self,x,y):
        self.x=x
        self.y=y
        print('爬行...')
        self.info()


    def info(self):
        print('当前位置:(%d,%d)'%(self.x,self.y))


    def attack(self):
        print('用嘴咬!')


class FlyAnt(Ant):


    def attack(self):
        print('用尾针!')


    def fly(self,x,y):
        print('飞行...')
        self.x=x
        self.y=y
        self.info()


class FinalAnt(FlyAnt,Ant):          wrong:class FinalAnt(Ant,FlyAnt)
    def attack(self):
        print('用身体撞!')


    def jump(self,x,y):
        print('跳跃...')
        self.x=x
        self.y=y
        self.info()


f1 = FinalAnt(x=1,y=1,color='blue')
f1.crawl(3,4)
f1.fly(1,2)
f1.attack()
f1.jump(6,6)






0 0
原创粉丝点击