组合
组合指的是一个对象中,包含另一个或多个对象。(一个对象拥有另一个对象中的属性/方法)
减少代码的冗余
# 组合实现 class People: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 老师类 class Teacher(People): def __init__(self, name, age, sex): super().__init__(name, age, sex) # 学生类 class Student(People): def __init__(self, name, age, sex): super().__init__(name, age, sex) # 日期类 class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day def tell_birth(self): print(f''' ===== 出生年月日 ===== 年: {self.year} 月: {self.month} 日: {self.day} ''') stu1 = Student('qwe', 109, 'female') date_obj = Date(1910, 11, 11) # 学生对象中包含一个自定义日期对象 stu1.date_obj = date_obj #stu1.date_obj = Date(1910, 11, 11) stu1.date_obj.tell_birth() #===== 出生年月日 ===== # 年: 1910 # 月: 11 # 日: 11
继承: 继承是类与类的关系,子类继承父类的属性/方法,子类与父类是一种 “从属” 关系。
组合: 组合是对象与对象的关系,一个对象拥有另一个对象中的属性/方法,是一种什么有什么的关系。
封装
什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的)
就是把一些不想让别人看的给隐藏起来了
封装数据:目的是保护隐私
功能封装:目的是隔离复杂度
如果用了私有的,在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用
封装: 体现在两点: 1、数据的封装(将数据封装到对象中) obj = Foo('宝宝',22) 2、封装方法和属性,将一类操作封装到一个类中 class Foo: def __init__(self,name,age): self.name = name self.age = age def show (self): print(self.name,self.age)
访问限制机制,私有方法 **(就是类属性前面加__)**
class Goods: # 按照打八折计算 (定义了一个私有类属性) __discount = 0.8 #变形后:_Goods__discount def __init__(self,name,price): self.name = name self.price = price def goods_price(self): return self.price * Goods.__discount apple = Goods('apple',10) print(apple.goods_price()) # print(Goods.__dict__) #类名.__dict__ print(Goods._Goods__discount)
# 封装:把你不想让人看的隐藏起来 # 数据封装:目的保护隐私 class Teacher: __School = 'oldboy' #类属性 def __init__(self,name,salary): self.name = name self .__salary = salary #_Teacher__salary # 老师的属性 值 #怎么把薪水隐藏起来? self.__salary=salary def foo(self): print('------') t=Teacher('egon',2000) print(t.__dict__) # print(t.name) print(t._Teacher__salary)#让显示出来 print(Teacher._Teacher__School) #类属性使用_类名__属性名 t.foo() #在本类内是可以正常调用的 #在本类外就必须以_类名__属性名调用(但是不建议你调)
property
调用的时候不用加括号
为什么要用property:将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
from math import pi class Circle: def __init__(self,radius): self.radius = radius @property #装饰器:把一个方法当成一个属性用了 def area(self): return self.radius * self.radius* pi @property def peimeter(self): return 2*pi*self.radius c = Circle(10) print(c.area) #当成一个属性来调了,就不用加括号了 print(c.peimeter)