• day26 封装,反射


    # 接口类 抽象类
    # python中没有接口类,有抽象类,abc模块中的metaclass = ABCMeta,@abstructmethod
    # 本质是做代码规范用的,希望在子类中实现和父类方法名字完全一样的方法
    # 在java的角度上看 是有区别的
    # java本来就支持单继承 所以就有了抽象类
    # java没有多继承 所以为了接口隔离原则,设计了接口这个概念,支持多继承了
    # python及支持单继承也支持多继承,所以对于接口类和抽象类的区别就不那么明显了
    # 甚至在python中没有内置接口类
    
    # 多态和鸭子类型
    # 多态 —— python天生支持多态
    # 鸭子类型 —— 不依赖父类的情况下实现两个相似的类中的同名方法
    
    # 封装 —— 私有的
    # 在python中只要__名字
    # 在python中只要__名字,就把这个名字私有化了
    # 私有化了之后 就不能能从类的外部直接调用了
    # 静态属性 方法 对象属性 都可以私有化
    # 这种私有化只是从代码级别做了变形,并没有真的约束
    # 变形机制 _类名__名字 在类外用这个调用,在类的内部直接__名字调用
    
    # class Room:
    #     def __init__(self,name,length,width):
    #         self.__name = name
    #         self.__length = length
    #         self.__width = width
    #     def get_name(self):
    #         return self.__name
    #     def set_name(self,newName):
    #         if type(newName) is str and newName.isdigit() == False:
    #             self.__name = newName
    #         else:
    #             print('不合法的姓名')
    #     def area(self):
    #         return self.__length * self.__width
    #
    # jin = Room('金老板',2,1)
    # print(jin.area())
    # jin.set_name('2')
    # print(jin.get_name())
    
    # 假设父类的私有属性 能被 子类调用么
    # class Foo:
    #     __key = '123'       # _Foo__key
    #
    # class Son(Foo):
    #     print(Foo.__key)     # _Son__key
    
    
    # 会用到私有的这个概念de场景
    # 1.隐藏起一个属性 不想让类的外部调用
    # 2.我想保护这个属性,不想让属性随意被改变
    # 3.我想保护这个属性,不被子类继承
    # property
    # 内置装饰器函数 只在面向对象中使用
    from mpmath import pi
    
    
    class Circle:
        def __init__(self, r):
            self.r = r
    
        @property
        def perimeter(self):
            return 2 * pi * self.r
    
        @property
        def area(self):
            return self.r ** 2 * pi
    
    
    # c1 = Circle(5)
    # print(c1.area)     # 圆的面积
    # print(c1.perimeter) # 圆的周长
    
    # class Person:
    #     def __init__(self,name,high,weight):
    #         self.name = name
    #         self.high = high
    #         self.weight = weight
    #     @property
    #     def bmi(self):
    #         return self.weight / self.high**2
    
    # jin = Person('金老板',1.6,90)
    # jin.bmi = 18
    # classmethod
    # staticmethod
    
    # class Person:
    #     def __init__(self,name):
    #         self.__name = name
    #     @property
    #     def name(self):
    #         return self.__name + 'sb'
    #     @name.setter
    #     def name(self,new_name):
    #         self.__name = new_name
    #
    # tiger = Person('泰哥')
    # print(tiger.name)
    # tiger.name = '全班'
    # print(tiger.name)
    
    # class Goods:
    #     discount = 0.8
    #     def __init__(self,name,price):
    #         self.name = name
    #         self.__price = price
    #     @property
    #     def price(self):
    #         return self.__price * Goods.discount
    # apple = Goods('苹果',5)
    # print(apple.price)
    
    # 属性 查看 修改 删除
    # class Person:
    #     def __init__(self,name):
    #         self.__name = name
    #         self.price = 20
    #     @property
    #     def name(self):
    #         return self.__name
    #     @name.deleter
    #     def name(self):
    #         del self.__name
    #     @name.setter
    #     def name(self,new_name):
    #         self.__name = new_name
    # brother2 = Person('二哥')
    # del Person.price
    # brother2.name = 'newName'
    # brother2
    # del brother2.name
    # print(brother2.name)
    # method 方法
    # staticmathod  静态的方法 ***
    # classmethod   类方法    ****
    # 类的操作行为
    # class Goods:
    #     __discount = 0.8
    #     def __init__(self,name,price):
    #         self.name = name
    #         self.__price = price
    #     @property
    #     def price(self):
    #         return self.__price * Goods.__discount
    #     @classmethod   # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
    #     def change_discount(cls,new_discount):  # 修改折扣
    #         cls.__discount = new_discount
    # apple = Goods('苹果',5)
    # print(apple.price)
    # Goods.change_discount(0.5)   # Goods.change_discount(Goods)
    # print(apple.price)
    # 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
    
    # java
    class Login:
        def __init__(self, name, password):
            self.name = name
            self.pwd = password
    
        def login(self): pass
    
        @staticmethod
        def get_usr_pwd():  # 静态方法
            usr = input('用户名 :')
            pwd = input('密码 :')
            Login(usr, pwd)
    
    
    Login.get_usr_pwd()
    
    
    # 在完全面向对象的程序中,
    # 如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法
    
    
    # 类方法和静态方法 都是类调用的
    # 对象可以调用类方法和静态方法么?   可以   一般情况下 推荐用类名调用
    # 类方法 有一个默认参数 cls 代表这个类  cls
    # 静态方法 没有默认的参数 就象函数一样
    
    
    # 面向对象的进阶
    # 网络编程
    # 反射 *****
    # name = 'alex'
    # 'name'
    
    class Teacher:
        dic = {'查看学生信息': 'show_student', '查看讲师信息': 'show_teacher'}
    
        def show_student(self):
            print('show_student')
    
        def show_teacher(self):
            print('show_teacher')
    
        @classmethod
        def func(cls):
            print('hahaha')
    
    
    alex = Teacher()
    for k in Teacher.dic:
        print(k)
    key = input('输入需求 :')
    # print(Teacher.dic[key])
    if hasattr(alex, Teacher.dic[key]):
        func = getattr(alex, Teacher.dic[key])
        func()
    # # alex.show_student()  'show_student'
    # func = getattr(alex,'show_student')
    # func()
    
    # hasattr getattr delattr
    # if hasattr(Teacher,'dic'):
    #     ret = getattr(Teacher,'dic')   # Teacher.dic   # 类也是对象
    # # ret2 = getattr(Teacher,'func')         # 类.方法  teacher.func
    # # ret2()
    #     print(ret)
    
    
    # menu = Teacher.dic
    # for k in menu:
    #     print(k)
    
    # 通过反射
    # 对象名 获取对象属性 和 普通方法
    # 类名 获取静态属性 和类方法 和 静态方法
    
    # 普通方法 self
    # 静态方法 @staticmethod
    # 类方法 @classmethod
    # 属性方法 @property
    
    # 继承
    # 封装的
    
    
    # 学员管理系统 : 开发规范
    # 整理面向对象的所有知识点
    # 时间计划表 :周末干什么 中等偏下的 每周来一天自习
  • 相关阅读:
    五、Docker网络管理
    四、Docker存储管理
    三、Docker镜像基础管理
    二、Docker容器基础管理
    模仿DotnetCore中间件的方式,做一个列表过滤的功能
    web开发常见的鉴权方式
    Go语言使用Godep进行包管理
    Go语言中的数据格式(json、xml 、msgpack、protobuf)
    epoll原理解释(转)
    内存管理之内存池概述(转)
  • 原文地址:https://www.cnblogs.com/wujunjie-sir/p/9257328.html
Copyright © 2020-2023  润新知