python基础- 面向对象之 组合与封装

[toc]

组合

什么是组合?

  • 在一个类中, 以另外一个类的对象作为数据属性, 称之为组合

组合有什么用?

  • 组合与继承都是用来解决代码的重用性问题
  • 继承是一种"是"的关系. 例如, 老师是人, 学生也是人 都有, 名字, 年龄 性别
  • 组合是一种 "有" 的关系,

怎么用组合?

看下面代码

# 示例

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, )
        self.course = []

    def add_course(self, course):
        self.course.append(course)

    def show_course(self):
        for line in self.course:
            print(line.c_name, line.c_price, line.c_cycle)

class Course:

    def __init__(self, c_name, c_price, c_cycle):
        self.c_name = c_name
        self.c_price = c_price
        self.c_cycle = c_cycle
#  实例化处一个 python课程
python_obj = Course("python", 22000, "6 mon")
#  将python课程 关联到 老师对象中
tea1 = Teacher("七里塘", 18, "male")
tea1.add_course(python_obj)
#  查看组合内对象的属性
# print(tea1.course[0].c_name)

# 为了便于查看, 需要在类内定义方法.
tea1.show_course()

封装

1. 什么是封装

  • 解释1:
    封装就是将一堆属性即方法封装起来.
    • 1: 定义类的过程就是封装, 由类产生对象,就是讲对象的属性和方法封装进对象体内.
  • 解释2:
    也有说 在类内 定义属性和方法时 使用__属性/方法名 这种方式是封装.
    2: 这种方式, 遵循的是
    • 在对象内部属性的使用是开放的,
    • 在对象外部使用内部属性或方法是封闭的
  1. 为什么用封装?
    可以通过 “对象.” 的方式 “存放/获取” 属性或方法。
    对象拥有 "." 的机制。
    方便数据的存取。

  2. 如何进行封装,
    在定义类的时候, 就进行了封装
    """

示例
class User:
    x = 10
    def __init__(self):
        pass

访问限制机制:

什么是访问限制机制:

  • 在创建类的时候, 定义类内部的 属性和方法是, 使用__ 开头,
  • 凡是以__开头的属性/方法,都会被限制, 外部不能直接访问

注意: 凡是在类内部定义__开头的属性或方法,都会变形为 _类名__属性/方法。

为什么要用 访问限制机制?

将一些隐私数据隐藏起来, 不让外部轻易获取

如何实现?

# 示例1

class User:
    _name = "王大"
    def tell_name(self):
        print(self._name)

obj = User()
# 直接用.属性名 方法 会找不到,
# print(obj.__name)
"""
Traceback (most recent call last):
  File "D:/Python_study/Project/oldboy/day22/封装.py", line 55, in <module>
    print(obj.__name)
AttributeError: 'User' object has no attribute '__name'
"""
#  所以只能通过接口调用
# obj.tell_name()

什么是property

property 是将类中的方法, 伪装成属性的方法.

posted @ 2019-11-28 14:26  七里塘  阅读(59)  评论(0编辑  收藏  举报