python中的继承(面向对象—类)
面向对象
1、类
class Person(object): def __init__(self,name,age): #self是实例 '''初始化''' print('开始执行') self.name=name self.age=age def show(self): print('he name is {0},and he age is {1}'.format(self.name,self.age)) def __del__(self): '''清理操作''' print('执行结束') obj=Person(name='wuya',age=18) obj.show()
'''
类属性范畴:
1.属于对象
2.属于类的
类属性它是属于类的
实例属性他是属于类的对象的
那么我们调用类里面的任何方法,首先是对类进行实例化,得到类的对象,然后使用对象调用类里面的方法
'''
- __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
- __doc__ :类的文档字符串
2、单继承:
# 当子类重写父类的方法后,子类实例化后,调用重写的方法,优先考虑的是子类的方法
'''继承里面的第一个原则:'''
# 前提:单继承
# 原则:当实例化类后,子类对象调用的方法和父类里面的方法重名,优先考虑子类的方法
例:
class Person(object): #父类(基类) def __init__(self,name,age): self.name=name self.age=age def show(self): print('name is {0},and age is {1}'.format(self.name,self.age)) class Work(Person): #子类(派生类)继承父类(基类) def __init__(self,name,age,salary): #super()的方法继承父类的实例属性 super().__init__(name,age) #继承父类 #Person.__init__(self,name,age)和 super().__init__(name,age)效果一样 self.salary=salary def show(self): print('name is {0},and age is {1},and salary is {2}'.format(self.name,self.age,self.salary)) objWork=Work(name='lyl',age=18,salary=200.3) #重新调用子类的show(),因为父类的满足不了子类 objWork.show()
3、多继承
例1:
class Father(object): def show(self): print('father show') class Mother(object): def show(self): print('mother show') '''从左到右的原则:''' # 前提:子类继承了N个父类,子类没有重写父类的方法 # 执行结果:实话子类后,条用父类的方法,她的查找顺序是从左到右, # 先到第一个去找,没有找到符合要求的,再接着第二个去找,直到找到符合要求的 class Son(Father,Mother): pass son=Son() son.show() '''从下到上的原则''' # 前提:子类继承了N个父类,子类重写了父类的方法 # 执行结果:实例化子类后,调用具体的方法优先考虑子类的方法 class Son(Father,Mother): # 重写了子类 def show(self): print('son show') son=Son() son.show()
例2:
class Person(object): def __init__(self,name,age): self.name=name self.age=age class Student(Person): def __init__(self,name,age,score): super().__init__(name,age) self.score=score class TestWork(Student): def __init__(self,name,age,score,salary): super().__init__(name, age, score) self.salary=salary def info(self): print('name:{0},age:{1},score:{2},salary:{3}'.format(self.name,self.age,self.score,self.salary)) obj=TestWork(name='lyl',age=18,score=90,salary=2000)
#只读 obj.info()
(1)在Python中,基于MRO的解析顺序规则,就会从左到右开始查找基类,如果找到第一个匹配的属性类,就会停止查找,
如果没有,那就继续查找,直到查找到符合要求的为止。MRO其实就是通过一个C3线性化算法来实现的,它的核心思想为:
• 子类会优先于父类检查
• 多个父类会根据它们在列表中的顺序被依次检查
• 如果对下一个类存在两个合法的选择,只能选择第一个
例:
class Person(object): pass # def info(self): # print('a') # # def info(self,name): # print('b',name) # # def info(self,name,age): # print('c',name,age) class Father(Person): pass class Son(Father): pass print(Son.mro()) # Son().info(name='lyl',age=18)
4、类实战
import json import sys class Actual(object): def out(self): username=input('请输入用户名:\n') password=input('请输入密码:\n') return username,password def register(self): username,password=self.out() temp=username+'|'+password #open('param1','param2') #param1:需要打开的文件,param2:打开文件只读模式(w:可写模式,目标文件为空时,创建新文件) #json.dump()是将python数据保存成json json.dump(temp,open('user.md','w')) def login(self): username,password=self.out() #json.load()用于从json文件中读取数据 lists=str(json.load(open('user.md'))).split('|') if username==lists[0] and password==lists[1]: return True else: print('请检查你的账户或者密码') def profile(self): lists=str(json.load(open('user.md'))).split('|') if self.login(): print('欢迎访问个人主页,我的昵称为{0}'.format(lists[0])) def main(self): while True: try: f=int(input('1.注册,2.登录,3.查看主页,4.退出\n')) if f==1: self.register() elif f==2: self.login() elif f==3: self.profile() elif f==4: break else:continue except Exception as e:continue if __name__ == '__main__': obj=Actual() obj.main()