Python 类和对象-上
#类和对象
class Human:
#属性 -> 成员属性(变量)
ear = 2
mouth = 1
sex = 'man'
age = 28
name = 'zhangwang'
married = False
color = 'yellow'
#特征 -> 成员方法(函数)
def walk(self):
print('直立行走')
def eat(self):
print('吃饭')
def sleep(self):
print('睡觉')
def playgame(self):
print('打游戏')
#查看类的值
print(Human)
#类的类型
print(type(Human))
#实例化对象操作
wangwang = Human()
#打印对象的值
print(wangwang)
#打印对象的类型
print(type(wangwang))
#检测类的成员(在类中声明的成员都可以看到)
print(Human.__dict__)
#检测对象中的成员
print(wangwang.__dict__)
print(wangwang.sex)
class GF:
#属性
sex = '女'
age = 18
height = '170'
weight = '50kg'
threeWei = ('36E','2.1','108CM')
#方法
def guang(self):
print('guang')
def eat(self):
print('chi')
def cry(self):
print('wu')
#类的基本操作
#访问
print(GF.sex)#属性
GF.eat(1)#方法
#修改
print(GF.age)
GF.age = 22#属性
print(GF.__dict__)
#定义一个函数
'''
def mycry():
print('Do not cry')
GF.cry = lambda :print('啊呜')#方法
GF.cry = mycry#方法
GF.cry()
'''
#添加
GF.hobby = 'act'#属性
print(GF.__dict__)
GF.upsky = lambda : print('upsky')#方法
GF.upsky()
#删除
del GF.threeWei
print(GF.__dict__)
del GF.cry
print(GF.__dict__)
#对象的基本操作
bingbing = GF()
print(bingbing.__dict__)
#访问
print(bingbing.sex)#属性
bingbing.eat()#方法
#修改
bingbing.age = 28 #属性 修改属性只会影响当前对象本身
print(bingbing.__dict__)
bingbing.cry = lambda : print('bigcry')
print(bingbing.__dict__)
bingbing.cry()
#添加操作
bingbing.cloth = '一袭长裙'#属性
print(bingbing.__dict__)
bingbing.walk = lambda : print('走红毯')#方法
print(bingbing.__dict__)
bingbing.walk()
#删除
bingbing.water = 'more'
bingbing.action = lambda : print('专业演员')
print(bingbing.__dict__)
del bingbing.water#属性
del bingbing.action#方法
print(bingbing.__dict__)
#关于self
'''
通过类调用的函数: 绑定类的方法
通过对象调用的函数: 非绑定类的方法
'''
class Human:
#属性
age = 18
sex = 'female'
name = 'sanpao'
#方法
def eat(self):
print(self)#通过类来调用的时候self只是函数的一个普通形参,必须给实参!
print('吃西瓜')
def drink(self):
print(self)#通过对象调用的时候self接受的肯定是当前的对象!此处的self不是关键字 只是一个形参,名字可以修改,但是推荐用self
print('喝西瓜汁')
#绑定类的方法(肯定)
def la():
print('puchi')
#绑定类的方法/非绑定类的方法(取决于怎么使用)
def sa(arg):
print('hualala')
#通过类调用
Human.eat('nidaye')
#通过对象调用
zw = Human
zw.drink(1)
#类来访问sa方法(绑定类的方法)
Human.sa(1)
#通过对象方法sa方法(非绑定类的方法)
zw.sa(1)
#人类
class Human:
#属性
age = 18
#私有化封装成员属性[只能在当前结构中使用]
__sex = 'male'
color = 'yellow'
hair = 'black'
#方法
def say(self):
print('ayi')
def walk(self):
print('sousou')
#私有化成员方法(只能在当前类或者对象的结构中访问)
def __niao(self):
print('xuxu')
#测试:自己访问自己的私有成员
def demo(self):
#访问私有方法niao
self.__niao()
print('测试私有成员的访问')
#实例化对象
tbw = Human()
#调用tbw的成员
'''
print(tbw.age)
print(tbw.hair)
print(tbw.color)
tbw.say()
tbw.walk()
'''
#相当于别人叫你的名字 想查看你的性别[私有化成员不可以在类/对象的当前结构外访问]
#print(tbw.sex)
#tbw.niao()
#访问测试方法demo[私有化成员可以在类/对象的当前结构中访问]
#tbw.demo()
#Python对私有成员的封装实际上使用了改名策略(name mangling)
print(Human.__dict__)
print(tbw._Human__sex)
tbw._Human__niao()
print(Human._Human__sex)
Human._Human__niao(1)
#继承
#刘备类:父类 -> 被其他类继承的类称之为父类(超类,基类)
class LiuBei:
#属性
familyname = '刘'
firsttime = '备'
sex = 'man'
money = '100'
country = '蜀国'
wife = ('甘夫人','糜夫人','孙尚香')
#方法
def say(self):
print('险损我一员大将')
#非绑定类的方法[对象访问]
def drink(self):
print(self)
print('来干了这杯')
def walk(self):
print('gogo')
#绑定类的方法
def la():
print('hualala')
#刘禅类:子类 -> 继承其他类的类称之为子类(派生类)
class LiuShan(LiuBei):
#子类独有的成员
#属性
weight = '180斤'
#方法
def douququ(self):
print('此间乐,不思蜀')
#重载父类方法
def say(self):
print('刘备baba')
#重载父类的drink方法,但是还要将父类中操作拿过来使用
def drink(self):
print('举起筷子,夹一口菜')
#喝酒 通过对象调用的方法的重载(推荐使用super().方法名())
super().drink() #LiuBei.drink(self)
#重载父类的la方法,但是还要将父类中操作拿过来使用
def la():
print('准备好纸')
#调用父类的la方法(推荐使用类名.方法名)
LiuBei.la()
#查看刘禅类
print(LiuShan.__dict__)#继承操作不会将成员直接复制到子类中
print(LiuShan.sex)
LiuShan.walk(1)
#print(LiuShan.wife)
'''
1.所有的类的父类都是object子类
2.子类继承父类则可以访问父类的所有成员.(私有成员除外)
3.子类继承父类并不会将父类的所有成员复制到子类当中去,访问父类成员是间接通过父类来访问的(目的:节省资源)
4.子类可以具有自己独有的属性和方法
5.子类可以重载父类中的方法,只需要设置和父类指定成员相同的名称即可实现重载,重载之后的成员,子类只会访问当前类中的成员,而不会调用父类中同名的成员
6.子类中如果重载父类的方法,并且还想将重载的父类方法借调过来使用,可以在重载的方法中使用如下方法
[父类名.方法()](适合类) 或者 [super().方法()](适合对象)
'''
result = issubclass(type,object)
print(result)
#访问子类独有的成员
LiuShan.douququ(1)
print(LiuShan.weight)
#访问继承来的方法
LiuShan.say(1)
#访问重载并且调用了父类的方法的方法
LiuShan.la()
ls = LiuShan()
ls.drink()
#Python语法中没有受保护的语法,程序员约定一种操作来实现受保护
class Father:
#属性
sex = 'man'
#受保护的
_money = 1000
color = 'yellow'
#私有化
__wife = 'bingbing'
#方法
def eat(self):
print(Father._money)
print('吃吃吃')
def niao(self):
print('哗哗哗')
class Son(Father):
#添加一个子类的方法用于测试子类中的访问
def test():
#方式访问父类中私有成员
#print(Father.wife)
#print(Son.wife)
#访问父类中公共的成员
print(Son.color)
#访问受保护的成员
print(Son._money)
Son.test()
Father.eat(1)
print(Father._money)
#受保护的定义
'''
私有化:只能在类或者对象的结构中访问
公共的:可以在任何位置访问
受保护:可以在当前类或者对象 和子类或者子类对象中访问
类内 子类中 类外部
私有化: √ × ×
受保护: √ √ √(×类外部应该不能访问)
公共的: √ √ √
'''
#单继承
class Biology:
#属性
life = '活的'
#方法
def shengzhi(self):
print('生育后代')
class animal(Biology):
#属性
age = 18
#方法
def jiao(self):
print('叫两声听听')
class mammal(animal):
#属性
gen = '胎生'
#方法
def weinai(self):
print('干了这杯奶')
class Human(mammal):
#属性
name = '囡囡'
def dapai(self):
print('王炸')
#实例化对象操作
zb = Human()
zb.dapai()
zb.weinai()
zb.jiao()
zb.shengzhi()
#多继承
class GrandPa:
def damajiang(self):
print('大三元')
class GrandMa:
def doudizhu(self):
print('飞机')
class LaoLao:
def dance(self):
print('弯弯的河水天上来')
class LaoYe:
def zhajinhua(self):
print('哗哗哗')
class PaPa:
def zhuanqian(self):
print('赚钱')
class MaMa:
def huaqian(self):
print('花钱')
class LaoWang:
def fanqiang(self):
print('FQ')
class Son(LaoWang,MaMa,PaPa,LaoYe,LaoLao,GrandMa,GrandPa):
def kengdie(self):
print('我老子是刘备')
#实例化对象
ls = Son()
ls.kengdie()
ls.fanqiang()
ls.huaqian()
ls.doudizhu()
ls.dance()
ls.damajiang()
ls.zhajinhua()
ls.zhuanqian()
#菱形继承
'''
动物类
人类 鸟类
鸟人类
'''
#动物类
class Animal:
#属性
pass
#方法
def say(self):
print('Animal张开嘴')
print('Animal合上嘴')
#人类
class Human(Animal):
#属性
pass
#方法
def say(self):
print('人类张开嘴')
#调用动物类的say方法
super().say()
print('人类合上嘴')
#鸟类
class Bird(Animal):
#属性
pass
#方法
def say(self):
print('鸟类张开嘴')
#调用动物类的say方法
super().say()
print('鸟类合上嘴')
#鸟人类
class Birdy(Human,Bird):
#属性
pass
#方法
def say(self):
print('鸟人类张开嘴')
#鸟类的say
Bird.say(self)
#人类say
Human.say(self)
print('鸟人类合上嘴')
#实例化鸟人对象
by = Birdy()
by.say()
#查看继承关系的mro列表
result = Birdy.mro()
print(result)
#mixin设计模式
#水果类
class Fruit:
pass
#南方水果类
class SouthFruit(Fruit):
pass
#北方水果类
class NorthFruit(Fruit):
pass
#北方礼物水果
class NorthGiftFruit(NorthFruit):
pass
#北方非礼物水果
class NorthNotGiftFruit(NorthFruit):
pass
#南方礼物水果
class SouthGiftFruit(SouthFruit):
pass
#南方非礼物水果
class SouthNotGiftFruit(SouthFruit):
pass
#苹果
class Apple(NorthGiftFruit):
pass
#梨
class Pear(NorthNotGiftFruit):
pass
#桔子
class Orange(SouthGiftFruit):
pass
#香蕉
class Banana(SouthNotGiftFruit):
pass
#多继承
#mixin设计模式
#水果类
class Fruit:
pass
#南方类
class South:
pass
#北方类
class North:
pass
#礼物类
class Gift:
pass
#非礼物类
class NotGift:
pass
#苹果类
class Apple(Fruit,North,Gift):
pass
#梨
class Pear(Fruit,North,NotGift):
pass
#桔子
class Orange(Fruit,South,Gift):
pass
#香蕉
class Banana(Fruit,South,NotGift):
pass