16 类的特性[python基础]

2020-01-04  本文已影响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()
上一篇下一篇

猜你喜欢

热点阅读