(五)封装

实例属性的第二种写法.封装过程:获取name,之后在输出的地方操作name,看不见过程,有了内部逻辑

复制代码
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def getx(self):
         return self.name,self.age

    def setx(self, name,age):
        if len(name)>2 and len(name)<7:
            self.name = name
        else:
            print('超出名字范围')
        if age>18:
            self.age=age
        else:
            print('未成年')

    def show(self):
        print(self.name,self.age)

obj=Person(name='wahah',age=22)
print(obj.getx())
obj.setx(name='zxx',age=17)
print(obj.getx())
复制代码

(六)继承

基类(父类):被继承的类,子类继承父类后,会继承父类里面所有的属性(数据属性&实例属性)以及方法 派生类(子类):继承其他的类,子类继承父类后,能够继承父类里面所有的方法以及属性,当然也可以调用

继承的N个原则:

1、子类可以继承N个父类,但是建议不要超过2个,最多2个

2、上下原则---》如果子类没有重写父类的方法,那么使用的是上下原则

  • A、如果子类没重写父类的方法,调用父类的方法,输出的结果是父类里面方法的输出结果
  • B、如果子类重写了父类里面的方法,那么调用该重写的方法,输出的结果是子类里面方法的输出结果

方法重写:子类重写了父类里面的方法,重写的目的是父类的方法没有办法满足子类的需求,那么就会重写

 

 4、从左到右原则,线性查找

所以在Python中,基于MRO的解析顺序规则,就会从左到右开始查找基类,如果找到第⼀个匹配的属性类,就会 停⽌查找,如果没有,那就继续查找,直到查找到符合要求的为⽌。MRO其实就是通过⼀个C3线性化算法来实现 的,它的核⼼思想为:

  • ⼦类会优先于⽗类检查

  • 多个⽗类会根据它们在列表中的顺序被依次检查

  • 如果对下⼀个类存在两个合法的选择,只能选择第⼀个

把Python2的类叫经典类,Python3的类叫新式类,其实在Python2中,多个类的继承算法叫深度优先,⽽Python3叫⼴度优先。

(七)多态(鸭子类型)

在Python⾥⾯,所谓鸭⼦类型就是指“如果看起来像,叫声像⽽且⾛路起来像鸭⼦,那么它就是鸭⼦”。

‘一切皆对象’

class实战——注册登录

import json
# 分离重复的代码
class Main(object):
    def out(self):
        username = input('请输入账户:\n')
        password = input('请输入密码:\n')
        return username,password
#注册
    def register(self):
        username,password=self.out()
        temp = username + '|' +password
        json.dump(temp, open('user.md', 'w'))

#登录
    def login(self):
        username, password =self.out()
        lists=str(json.load(open('user.md','r'))).split('|')
        if username==lists[0] and password==lists[1]:
            return True
        else:
            return False

#个人主页
    def profile(self):
        lists=str(json.load(open('user.md','r'))).split('|')
        if self.login():
            print('{nick}登录成功'.format(nick=lists[0]))
        else:
            print('账户或密码错误')

    def main(self):
        while True:
            try:
                f=int(input('1,注册 2,个人主页 3,退出\n'))
                if f==1:
                    self.register()
                elif f==2:
                    self.profile()
                elif f==3:
                    break
            except:
                continue

# 主函数,程序执行的入口
if __name__ == '__main__':
    obj=Main()
    obj.main()