# -*- coding:utf-8 -*- # -*- coding:utf-8 -*- #处理一类事物,这些事物都具有相同的属性和功能,可以使用面向对象 #当有几个函数,需要反反复复传入相同参数的时候,可以使用面向对象 #这些参数都是对象的属性 class Person: def __init__(self,name): self.name = name def func(self): print(self.age) #额 ming = Person('小明') ming.age = '这是user' ming.func() #class 类名(): # 静态属性='' # def __init__(self): # self.name = 'nezha' # def func(self): # print(self.age) #对象 = 类名() #对象.方法名() #对象.属性名() #对象.name #对象.age = 18 #对象.func() #组合:表达的是 什么有什么的关系***** #一个类的属性,是另外一个类的对象 class Course: def __init__(self,name,price,period): self.name = name self.price = price self.period = period python = Course('python全栈',19800,'6months') class Classes: def __init__(self,name,course): self.name = name self.course = course pys9 = Classes('s9',python) #组合 print(pys9.course.name) python.name = "python脱产班" #修改了了以后, print(pys9.course.name) #这里也跟着修改了 print('-------------------------------------------') #错误写法 耦合度太高 class Classes2: def __init__(self,name,course): self.name = name self.course_name = python.name #耦合度太高的写法 pys92 = Classes2('s9',python) #组合 print(pys92.course_name) python.name = "python网路班" #修改了了以后, print(pys92.course_name) #pys92并没有跟着修改还是:脱产班 #命名空间:类和对象分别存在不同的命名空间*** #面向对象的三大特性:继承 多态 封装 #继承: # 单继承**** # 父类(超类,基类) # 子类(派生类) :派生发放和派生属性 # 子类的对象在调用方法和属性:先使用自己的,自己没有再使用父类的 # 多继承***(面试) #抽象类和接口类 #子类的对象在调用方法和属性时先使用自己的,自己没有使用离子类最近的那个父类的方法 #经典类和新式类:继承规则不同:深度优先和广度优先 ***** #super只能在python3中使用 mro **** #super是根据 mro 广度优先的顺序找上一个类 #多态:*** (面试) #多态和鸭子类型 #封装:**(面试) #私有的 :__名字 #如果是私有的只能类的内部调用、子类都无法继承 #三个装饰器 # @propery **** 规范! 面试 @name.setter 等 # @staticmethod ** # # @classmethod ***** #当一个方法只使用类的静态变量时,就给这个方法加上 @classmethod,默认传cls参数 class Goods: __disconut = 0.5 #折扣 def __init__(self,name,price): self.name = name self.__price = price @property def price(self): return self.__price * Goods.__disconut @classmethod #把一个方法变成 类方法,这个方法可以直接被类调用,不需要依托对象 def change__disconut(cls,new_disconut): cls.__disconut = new_disconut apple = Goods('苹果',5) print(apple.price) Goods.change__disconut(0.2) #修改折扣(不需要依托对象) print(apple.price)