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()

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-08-17 18:31  就不将就就  阅读(226)  评论(0编辑  收藏  举报