16 类的特性[python基础]
类及类的定义
-
面向对象的基础
-
一种类型,类的类型
-
类的实例称之为对象
-
一种用户自定义的类型
-
类里面有很多自定义的属性和方法
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()