class person:
count=0
def __int__(self):
self.name='无名'
self.age=18;
def show(self):
print('姓名:'+self.name+' 年龄:'+str(self.age))
@classmethod
def sayHello(cls):
# 类方法更倾向于 工具方法 不需要重复创建对象
# 不是以对象的形式去调用
print('这是一个person 类')
# 一般情况下 静态方法 会单独放在一个模块里
@staticmethod
def SayHi(name):
print(name+'你好....')
==========================================
类属性:属于类的成员,对象共有的
修改方式:类名 类属性=...实例对象,__class__类属性=...
类方法:在方法上添加 @coassmethod 装饰器
@coassmethod
def class_method(cls):
if '__main__'==__name__:
也可以使用类方法调用类属性,也可以通过对象调用类属性
静态方法:
方法前加@coassmethod,静态方法可以加参数,
静态方法既和类没关系,也和对象没关系,也可以类和对象调用
面向对象三大特征:封装 ,继承 ,多态
实例对象,__class__类属性=...
========================================== person.phone='110'
zhangsan=person()
zhangsan.name='张三'
zhangsan.age=20
zhangsan.show()
zhangsan.__class__.phone='1355865865'
lisi=person()
lisi.name='李四'
lisi.age=90
lisi.show()
lisi.__class__.phone='13657867787'
print(lisi.__class__.phone)
person.sayHello()
person.SayHi('5-11')
继承:
子类继承父类: () 子类可以使用父类的属性和方法,简化代码。
当生成子类对象时,先初始化父类对象,
所以如果父类有__init__()方法,并且有属性时,要通过子类的构造赋值
初始化时:在子类中,调用父类的属性时,在__init__()方法中使用
即: super().__init__(self,属性)或 self.属性
父类.__init__(self,参数)==>父类.__init__(self)-->调用无参
super(子类,self).__init__(参数)
用子类的父类的 __init__
四种方法给父类传参
多继承:类同时继承多个父类,class C(A,B),
当有AB均有相同方法,而子类又重写时,调用谁的方法,(子类)
如果子类重写没有方法,则调用哪个父类的方法?(左侧,优先继承的类)
类名.mro(),可以看到所有父类,即搜索顺序
==========================================
案例 宠物:
class pet:
def __init__(self,name,love,health):
'''
快速初始化数据
:param name:
:param love:
:param health:
'''
# 代码的职能 谁做谁的事
self.name=name
self.love=love
self.health=health
def show(self):
print('宠物名'+self.name+'健康值:',self.health,'亲密度',self.love)
class Dog(pet):
def __init__(self,name,love,health,):
# super().__init__(name,love,health) 第一种方法
# pet.__init__(self,name,love,health) 第二种方法
super().__init__(name,love,health) #第三种方法
self.strain='拉布拉多'
def eat(self):
print(self.strain+'正在吃饭')
def showlnfo(self):
super().show()
print('品种:',self.strain)
class lang:
def show(self):
print('来自北方的狼。。')
class can(Dog):
def __init__(self,name,love,health):
super(). __init__(name,love,health)
self.strain = '哆啦A梦'
# 代表程序主入口 是从这进入的
if __name__=='__main__':
dog=Dog('小七',30,99)
dog.eat()
dog.love+=20
dog.show()
maomi = can('哆啦A梦\t', 80, 100)
maomi.eat()
maomi.show()
==========================================
练习 二.
DVD:价格 名称 状态
class DVD:
def __init__(self,name,price,state):
self.name=name
self.price=price
self.state=state
if __name__=='__main__':
youran=DVD('悠然的故事',200,1) #0:借出 1未借出
chuntian=DVD('春天的风',200,0) #0:借出 1未借出
dongtian=DVD('冬天的阳光',200,1) #0:借出 1未借出
dvds = {youran.name:youran,chuntian.name:chuntian,dongtian.name:dongtian}
while True:
print('----DVD管理系统-----')
print('1.查询说有DVD')
print('2.增加DVD')
print('3.借出DVD')
print('4.归还DVD')
print('5.退出')
num=int(input('请选择:'))
if num == 5:
break
elif num == 1:
print('名字\t价格\t状态')
for key in dvds.keys():
if dvds.get(key).state==0:
print(key+'\t'+str(dvds.get(key).price)+'\t借出')
else:
print(key+'\t'+str(dvds.get(key).price)+'\t未借出')
elif num == 2:
name=input('请输入DVD的名字:')
while name in dvds.keys():
name = input('DVD的名字已存在,请重新输入:')
price = input('请输入DVD的价格')
new_dvd =DVD(name,price,1)
dvds[name] = new_dvd
print('添加成功')
elif num == 3:
name = input('请输入要借出的DVD的名字:')
while name not in dvds.keys():
name = input('DVD不存在,请重新输入:')
if dvds.get(name).state==0
print(name+'已借出')
else:
dvds.get(name).state = 0
print(name+'借出成功')
elif num == 4:
name = input('请输入要归还的DVD名字:')
while name not in dvds.keys():
name = input('DVD不存在,请重新输入:')
if dvds.get(name).state == 1:
print('DVD 未借出')
else:
days = int(input('请输入借出的天数:'))
print('请刷卡:',int(dvds.get(name).price)*days,'.00元')
dvds.get(name).state = 0
print('归还成功!')