美文网首页
16 类的特性[python基础]

16 类的特性[python基础]

作者: 乱弹琴给 | 来源:发表于2020-01-04 00:30 被阅读0次

    类及类的定义

    • 面向对象的基础

    • 一种类型,类的类型

    • 类的实例称之为对象

    • 一种用户自定义的类型

    • 类里面有很多自定义的属性和方法

    Cat类

    image.png

    //可以把猫科作为一个基类(定义属性,和吃\捉\叫 三个方法),下面分家猫\老虎\熊猫 三个子类(继承三个方法,重写为喵喵的叫,捉老鼠,爱吃鱼, 嗷嗷叫,捉动物,爱吃肉,...).

    类的特殊方法-构造函数

    //类实例化时执行__init__方法,self表示类的实例对象的引用.
    

    //init() 是一个默认隐藏的魔法方法,可以重写

    def __init__(self, name, *args, **kwargs):
    

    self.name = name //这里定义的属性,在类里用dir(类名)是看不到的,因为它在类的实例对象里.

        pass
    

    类的特殊方法-析构函数

    //默认隐藏方法,一般不重写,python回收类资源时会调用此方法

    def __del__(self):
    
        pass
    

    其他类的特殊方法

    //用dir(类名) 可以查看全部方法

    //help(类名)

    //doc:文档信息

    //module:模块信息

    //tag:自定义的类属性

    //catch:自定义的类方法

    //class:

    //__bases:继承自哪个类

    //python中的自定义类都继承自python的Object类

    类的实现

    class Cat(object):

    //猫科动物类

    tag = '猫科动物'

        def __init__(self, name, age, , sex = None)  //sex有一个默认值,带默认值的必须在后面,如果没有默认值,又在实例化时不传参数,会报错.
    

    self.name = name

    self.__age = age //两个下划线开头的在python中表示私有的变量

    def set_age(self, age):

    //提供一个对外方法,改变猫的年龄

    self.__age = age

    return self.__age //不return也可以

        def show_info(self):
    

    //显示猫的信息,提供一个对外方法

    rest = '我叫{0},今年{1}岁.我是{2}'.format(self.name,self.__age, self.sex)

    return rest

    def catch(self):

    //捉

    pring('猫可以捕捉老鼠.')

    def eat(self):

    //吃

    print('猫喜欢吃鱼')

    def get_age(self):

    print('{0}的年龄是{1}岁'.format(self.name, self.__age))

    类的实例

    if name = 'main':

    //实例化你家的小猫
    
    cat_black = Cat('小黑', 2)
    

    cat_black.show_info()

    cat_black.name = '黑黑' //可以直接访问改变

    cat_black.__age = 7 //无法操作私有变量

    cat_black.set_age(7) //使用提供的接口更改年龄

    Cat.lag

    cat_black.tag //类的公共变量属性,都可以拿到

    //以下实例化另一只猫,我家的小白

    cat_white = Cat('小白', 3, '母的')

    cat_white.show_info()

    类的实例鉴定

    //判断cat是否为类Cat的实例

     isinstance(cat,_black Cat)
    
    True
    

    类的继承

    //判断是否为其子类

    issubclass(cat, Cat)
    

    True

    //调用父类的方法

    def eat(self):

    super(Cat,self).eat()

    print('猫还喜欢吃鱼')

    //以下演示继承

    class BaseCat(object):

    //猫科动物的基础类

    tag = '猫科动物'

    def init(self, name):

    self.name = name //猫都有名称

    def eat(self):

    //猫吃东西

    print('猫都要吃东西')

    class Tiger(BaseCat):

    //老虎类

    def eat(self):

    //调用父类的方法

    super(Tiger, self).eat()

    print('我还喜欢吃肉,大猪肉')

    class Panda(BaseCat):

    //熊猫类

    class PetCat(BaseCat):

    //家猫

    //调用父类的方法

    super(PetCat, self).eat()

    print('我还喜欢吃猫粮')

    class HuaCat(PetCat):

    //中华田园猫

        //pass
    

    super(HuaCat, self).eat()

    print('我还喜欢吃零食')

    class DuanCat(PetCat):

    //英国短毛

    if name == 'main':

    //实例化中华田园猫

    cat = HuaCat('小黄')

    cat.eat()

    //结果:猫都要吃东西;我还喜欢吃猫粮食;我还喜欢吃零食

    //子类的判断

    issubclass(DuanCat, BaseCat)  //TRUE
    
    issubclass(DuanCat, PetCat)  //TRUE 
    

    类的多重继承示例

    image.png

    //多重继承时,如果继承的多个类里 有名字相同的方法,只会执行第一个.

    //所以容易出现BUG,尽量少用多重继承,或者把继承类里的方法写清楚.

    类的多态

    PASS

    类的高级特性之@property 描述符

    //property将类的一些方法当作属性来使用

    class PetCat(object):

    //家猫类
    

    def init(self, name, age):

    //构造方法

    self.name = name

    //私有属性,不能直接操作

    self.__age = age

    @property //描述符

    def age(self): //定义一个提供访问__age的方法

    return self.__age

    @age.setter //描述符,加入这个描述符就不会和上面的age冲突

    def.age(self, value): //定义一个可以设置__age的方法

    if not isinstance(value, int):

    print('年龄只能是整数')

    return 0

    if value < 0 or value >100:

            print('年龄只能介于0-100之间')
    
            return 0
    

    self.__age = value

    @property //描述符,增加这个描述符,就可以用直接用show_info调用此方法

    //@property将类的一些方法当作属性来使用
    

    def show_info(self):

    return '我叫:{0},今年{1}岁'.format(self.name,self.age)

    def str(self): //重写返回实例化对象,为了便于调试,这样在main中调用cat_black = PetCat('小黑', 2)>print(cat_black)时,就会显示小黑信息

    return self.show_info()

    if name = 'main':

    cat_black = PetCat('小黑', 2)  //得到一个实例化对象
    
    //rest = cat_black.show_info()  
    

    rest = cat_black.show_info //方法定义上加入@property后就能直接这样调用

    print(rest) //打印小黑信息

    print(cat_black) //打印一个实例化对象

    类的高级特性 slots

    //为指定的类设置一个静态属性列表
    

    //为属性很少的类节约内村空间

    class PetCat(object):

    //家猫类
    
    __slots__ = ('name', 'age')    //如果用__slots__修饰了类的属性,那我们就只能对这两个属性进行访问和修改,也不能填加其他的属性和方法,子类也会继承这个属性,如果要子类使用或填加其他的可以在子类里对__slots__进行拼接,如__slots__('color', )
    
    def __init__(self, name, age):
    
        //构造方法
    
        self.name = name
    
        //私有属性,不能直接操作
    
        self.age = age
    
    @property     //描述符,增加这个描述符,就可以用直接用show_info调用此方法 
    
    //@property将类的一些方法当作属性来使用
    
    def show_info(self):
    
        return '我叫:{0},今年{1}岁'.format(self.name,self.age)
    
    def __str__(self):    //重写返回实例化对象,为了便于调试,这样在main中调用cat_black = PetCat('小黑', 2)>print(cat_black)时,就会显示小黑信息
    
        return self.show_info()
    

    class HuaCat(PetCat):

    __slots__ = ('color',)    //子类继承父类的__slots__可以通过这样拼接增加可以访问或修改的属性和方法.
    
    pass
    

    if name = 'main':

    cat_black = PetCat('小黑', 2)  //得到一个实例化对象
    
    //rest = cat_black.show_info()  
    
    rest = cat_black.show_info  //方法定义上加入@property后就能直接这样调用
    
    //__slots__  例子
    

    cat_white = HuaCat('小白', 3) //增加

    rest = cat_white.show_info

    print(rest)

    cat_white.color = '白色' //修改

    print(cat_white.color)

    cat_white.name = '旺旺'
    

    print(cat_white.show_info)

    类的静态方法和实例方法

    //@staticmethod ; @classmethod

    //属于设计模式,一般在框架设计时使用

    class Cat(object):

    tag = '猫科动物'

    def init(self, name):

    self.name = name

    @staticmethod //静态方法

    def breath(self): //声明静态方法可以省略 def breath(),因为self是一个实例化的类本身,静态方法不用实例化就可以使用

    print('猫都需要呼吸空气')

    @classmethod

    def show_info(cls, name):

    //print('类的属性:{0}, 实例的属性: {1}'.format(cls.tag, cls.name)) //这个时候cls.name是没有数据的,因为没有实例化,,没有经过init(self, name)初始化

    return cls(name) //这一步就相当于实例化了 cat = Cat(name) ;return cat 相当于这两步

    def show_info2(self):

    print('类的属性:{0}, 实例的属性:{1}'.format(self.tag, self.name))

    if name == 'main':

    //@staticmethod说明

    cat =Cat() //实例化,
    

    cat.breath() //调用实例化的类方法

    Cat.breath()   //使用@staticmethod后可以直接调用类方法,不用实例化
    
    //@classmethod  说明
    

    cat2 = Cat.show_info('小黄') //相当于实例化

    cat2.show_info2()
    

    相关文章

      网友评论

          本文标题:16 类的特性[python基础]

          本文链接:https://www.haomeiwen.com/subject/dyxxactx.html