zoukankan      html  css  js  c++  java
  • 类的组合-多态-封装等特性的简单学习

    组合:

    1.什么是组合?

    ​ 对象的某个属性是另一个类的对象

    class Foo:
    	def __init__(self,bar):
            self.bar = bar 
    class Bar:
        pass
    
    bar = Bar()
    f = Foo(Bar())
    f = Foo(bar)
    

    2.为什么使用组合

    ​ 可以减少代码的冗余,如我们有两个类分别是学生类,教师类,我们需要学生添加一个选课信息的一个属性,课程信息包括课程名,课程价格,课程周期.这样我们每次添加选课信息都要输入这些信息.所以我们把它定义成一个类.

    class Student:
        def __init__(self,name,age,course):
            self.name = name 
            self.age = age
            self.course = course
    class Teacher:
        def __init__(self,name,age,level,course):
            self.name=name
            self.age=age
            self.level=level
            self.course=course
    class Course:
        def __init__(self,cname,cprice,cperiod)
        	self.cname = cname
            self.cprice = cprice
            self.cperiod = cperiod
    course = Course('python',19800,7)
    stu = Student('tom',18,course)
    tea = Teacher('mary',30,course)
            
    

    多态:

    1.什么是多态?

    ​ 它表示的是一类事物的多种形态,如水在不同的温度下有不同的状态.

    2.什么是多态性?

    ​ 多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

    import abc
    class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
        @abc.abstractmethod  # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法
        def talk(self):
            raise AttributeError('子类必须实现这个方法')
    class People(Animal):  # 动物的形态之一:人
        def talk(self):
            print('say hello')
    class Dog(Animal):  # 动物的形态之二:狗
        def talk(self):
            print('say wangwang')
    class Pig(Animal):  # 动物的形态之三:猪
        def talk(self):
            print('say aoao')
    peo2 = People()
    pig2 = Pig()
    d2 = Dog()
    d2.talk()
    pig2.talk()
    

    3.多态性有哪些好处?

    ​ 1.增加了程序的灵活性

    ​ 2.增加了程序的可扩展性

    封装:

    1.什么是封装?

    ​ 封装的是指我们类的属性以及方法,放在一起就是封装

    2.为什么要封装?

    ​ 封装数据的主要原因是:保护隐私

    ​ 封装方法的主要原因是:隔离复杂度

    3.封装的两个层面

    ​ 1.创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj的方式去访问里面的名字,这本身就是一种封装.

    ​ 2.类中把某些属性和方法隐藏起来(或者说变成私有的),只在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问.

    #在python中用双下划线的方式实现隐藏属性(设置成私有的)
    #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
    class A:
        __n = 0
        def __init__(self):
            self.__x = 10
        def __foo(self):
            print('from A')
        def bar(self):
            self.__foo()
    

    1.统计对象的name属性被查看了多少次

    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
            self.count = 0
        def getName(self):
            self.count += 1
            return self.__name
    
    stu = Student('tony',18)
    stu.getName()
    print(stu.count)
    

    2 统计一下类被实例化了多少次

    class Student:
        count = 0
        def __init__(self,name,age):
            self.__name = name
            self.age = age
            Student.count+=1
    stu = Student('tony',18)
    stu2 = Student('tony',18)
    stu3 = Student('tony',18)
    print(Student.count)
    

    3 通过property写一个计算圆形面积的类中有个area

    class circle:
        def __init__(self,r):
            self.__r = r
        @property
        def area(self):
            return 3.14*self.__r**2
    c = circle(1)
    print(c.area)
    
    

    4 选课系统的管理员注册,登录功能写完

    import os
    import pickle
    dic_msg = """
        1-管理员注册
        2-管理员登陆
    """
    admin = {'username':None}
    def admin_register():
        username = input('请输入用户名:')
        password = input('请输入密码:')
        filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)),'admin')
        file = os.path.join(filepath,f'{username}.pkl')
        if os.path.exists(file):
            print('用户名已存在!')
        else:
            user = {'username':username,'password':password}
            with open(file,'wb') as fw:
                pickle.dump(user,fw)
            print('注册成功!')
    
    def admin_login():
        username = input('请输入用户名:')
        password = input('请输入密码:')
        filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'admin')
        file = os.path.join(filepath, f'{username}.pkl')
        if not os.path.exists(file):
            print('用户名不存在!')
        else:
            with open(file,'rb') as fr:
                user = pickle.load(fr)
            if user['password'] == password:
                admin['username'] = username
                print('登录成功!')
            else:
                print('密码错误!')
    
    dic_func = {
        '1':admin_register,
        '2':admin_login
    }
    
    def run():
        while True:
            print(dic_msg)
            choice = input('请输入你要选择的功能编号:(q退出)')
            if choice == 'q':
                break
            if choice not in dic_func:
                print('你的输入有误1')
                continue
            dic_func[choice]()
    
    if __name__ == '__main__':
        run()
    

  • 相关阅读:
    SQLyog 使用笔记,自增主键数据冲突错误
    扫一扫的意义
    js 加法运算
    linux crontab执行shell脚本中包含相对路径的问题
    Nginx笔记总结十二:nginx版本号隐藏
    Nginx笔记总结十一:Nginx重写规则指南
    Nginx笔记总结十:Nginx日志切割
    Nginx笔记总结九:Nginx日志配置
    Nginx笔记总结八:ngx_http_core_module模块中的变量
    Nginx笔记总结七:root和alias文件路径配置
  • 原文地址:https://www.cnblogs.com/cheng825/p/11425991.html
Copyright © 2011-2022 走看看