组合

组合指的是一个对象中,包含另一个或多个对象。(一个对象拥有另一个对象中的属性/方法

减少代码的冗余

# 组合实现
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)
01-07 03:59
查看更多