# 接口类 抽象类 # 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 # 继承 # 封装的 # 学员管理系统 : 开发规范 # 整理面向对象的所有知识点 # 时间计划表 :周末干什么 中等偏下的 每周来一天自习