Python基础学习笔记(22)面向对象的命名空间 组合

Python基础学习(22)面向对象的命名空间 组合

一、今日大纲

  • 面向对象的命名空间
  • 面向对象的组合

二、面向对象的命名空间

  1. 对象和类的范围

    拓展到之前我们学习过的基础数据类型和函数,参考类的定义(内置一部分属性和方法),可以获知:之前学习到的一切基础数据类型、函数、装饰器、生成器、迭代器也是类。在 Python 中,一切皆为对象,而对象的类型就是类;

    • 123 的类是 int/float
    • {} 的类是 dict
    • alex = Person()的类是Person
    • xiaobai = Dog()的类是Dog
  2. 静态变量/静态属性和绑定方法

    我们现在定义一个类A:

    class A:
        Country = '中国'  # 静态变量/静态属性 存储在类的命名空间里
        def __init__(self, name, age, country):  # 绑定方法 存储在类的命名空间
            self.name = name
            self.age = age
            self.Country = country
        def func1(self): pass  # 绑定方法 存储在类的命名空间
        def func2(self): pass
        def func3(self): pass
        def func4(self): pass
        def func5(self): pass
        def func6(self): pass
    

    类中直接定义的Country变量就是静态变量/静态属性,它与__init__方法中定义的变量有以下不同点:

    • 对象中的变量只属于对象本身,每个对象都有属于自己的空间来存储对象的变量;
    • 当使用对象名去调用某一个属性的时候会优先在自己的空间中寻找,找不到再去对应的类中寻找;
    • 在对象的引用操作中如果对象自身没有就会引用类的,如果类也没有就会报错;
    • 对于类来说,类中静态变量所有对象都可以读取,并且读取的是同一份变量。
  3. 静态变量/静态属性的用处

    • 静态变量是所有由此类实例化的对象所共享的值,那么这个变量应该被定义成静态变量;
    • 所有和静态变量相关的增删改查都应该使用类名类处理,而不应该使用对象名直接修改静态变量。
  4. 类和对象的命名空间:

    • 类:静态变量、绑定方法
    • 对象:类指针、对象的属性(实例变量)
  5. 练习题

    实现一个类,能够自动地统计这个类实例化了多少对象

    class Cls:
        cnt = 0
        def __init__(self):
            Cls.cnt += 1
    
    a = Cls()
    print(a.cnt)
    

三、面向对象的组合

面向对象中的组合就是:将一个对象作为属性赋予给了一个类;可能现在还比较难理解,我们举个例子:现在要开发一个教学系统,需要编写一个学生类,其中包含性别、年龄、学号、班级、手机等信息;对应地,我们还要编写一个班级类,其中包含班级名字、开版时间、当前讲师等。

# 学生类:性别 年龄 学号 班级 手机号
class Student:
    def __init__(self, name, gender, age, number, cls, phone):
        self.name = name
        self.gender = gender
        self.age = age
        self.number = number
        self.cls = cls
        self.phont = phone

# 班级信息:班级名字、开班时间、当前讲师
class ClS:
    def __init__(self, cname, begin, teacher):
        self.cname = cname
        self.begin = begin
        self.teacher = teacher
        
# 定义两个学生和两个班级
dazhuang = Student('dazhuang', 'male', 18, 27, 'python23', 13812012012)
xuefei = Student('xuefei', 'female', 18, 17, 'python22', 13812012013)
py22 = Cls('python22', '2019-04-26', 'xiaobai')
py23 = Cls('python23', '2019-05-28', 'baoyuan')

这时,加入我们想要查看大壮和雪飞的班级的开班日期,我们为了更加简便可以尝试将班级对象作为参数传到大壮和雪飞对象中去:

dazhuang = Student('dazhuang', 'male', 18, 27, py23, 13812012012)
xuefei = Student('xuefei', 'female', 18, 17, py22, 13812012013)

于是经过组合的操作后,我们就可以用下列方式查看大壮的班级信息了:

print(dazhuang.cls.begin)  # 2019-05-28

学会以上知识,我们可以做一个练习:

# 练习:
# 班级类包含一个属性:课程
# 课程包含:课程名称、周期、价格
# 创建两个班级 linux57和python22
# 查看linux57期的班级所学课程的价格
# 查看python22期班级所学课程的周期
class Course:
    def __init__(self, cname, cycle, price):
        self.cname = cname
        self.cycle = cycle
        self.price = price

class Cls:
    def __init__(self, name, course):
        self.name = name
        self.course = course

母猪的产后护理 = Course('母猪的产后护理', '10 month', 20000)
忽悠 = Course('忽悠', '20 month', 1)
python22 = Cls('python22', 母猪的产后护理) 
linux57 = Cls('linux57', 忽悠)
print(linux57.course.price, python22.course.cycle)
 # 1 10 month 
原文地址:https://www.cnblogs.com/raygor/p/13347329.html