类和对象命名空间
# 类里 可以定义两种属性 # 静态属性 # 动态属性 class Course: language = ['Chinese'] def __init__(self,teacher,course_name,period,price): self.teacher = teacher self.name = course_name self.period = period self.price = price def func(self): pass # Course.language = 'English' # Course.__dict__['language'] = 'Chinese' # print(Course.language) python = Course('egon','python','6 months',20000) linux = Course('oldboy','linux','6 months',20000) #['chinese'] python.language = 'chinese' 这里python在自己对象空间创建了language = ''chinese”(赋值) # print(python.language)优先调用自己的language = ''chinese”,调不到Course.language的值了 # print(linux.language) # Course.language = 'Chinese' # print(python.language) # print(linux.language) # del python.language 删除后才能调到Course.language的值 # print(python.language) # print(python.__dict__) # print(Course.language) # print(linux.language) # print(linux.__dict__) # 类中的静态变量 可以被对象和类调用 # 对于不可变数据类型来说,类变量最好用类名操作 # 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的 # 模拟人生 # class Person: # money = 0 # def work(self): # Person.money += 1000 # # mother = Person() # father = Person() # Person.money += 1000 # Person.money += 1000 # print(Person.money) # mother.work() # father.work() # 创建一个类,每实例化一个对象就计数 # 最终所有的对象共享这个数据 # class Foo: # count = 0 # def __init__(self): # Foo.count += 1 # # f1 = Foo() # f2 = Foo() # print(f1.count) # print(f2.count) # f3 = Foo() # print(f1.count) # 认识绑定方法 # def func():pass # print(func) # # class Foo: # def func(self): # print('func') # def fun1(self): # pass # f1 = Foo() # print(Foo.func) # print(f1.func) # print(f1.fun1) ## 包 —— __init__ # import package —— 类的实例化的过程 # import time # time.time() # 类里的名字有 类变量(静态属性量)+ 方法名(动态属性) # 对象里的名字 对象属性 # 对象 —— > 类 # 对象找名字 : 先找自己的 找类的 再找不到就报错 # 对象修改静态属性的值 # 对于不可变数据类型来说,类变量最好用类名操作 # 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
language如果是列表
python.language[0]=‘Chinese’ 》修改,列表内存地址不变,共享
python.language=[‘Chinese’ ] 》重新赋值,在自己对象空间创建了一个属于python的Language
组合的用法
# 面向对象的三大特性 : 继承 多态 封装 # 组合 # 人狗大战 class Dog: def __init__(self,name,aggr,hp,kind): self.name = name self.aggr = aggr self.hp = hp self.kind = kind def bite(self,person): person.hp -= self.aggr class Person: def __init__(self,name,aggr,hp,sex): self.name = name self.aggr = aggr self.hp = hp self.sex = sex self.money = 0 def attack(self,dog): dog.hp -= self.aggr def get_weapon(self,weapon): if self.money >= weapon.price: self.money -= weapon.price self.weapon = weapon self.aggr += weapon.aggr else: print("余额不足,请先充值") class Weapon: def __init__(self,name,aggr,njd,price): self.name = name self.aggr = aggr self.njd = njd self.price = price def hand18(self,person): if self.njd > 0: person.hp -= self.aggr * 2 self.njd -= 1 alex = Person('alex',0.5,100,'不详') jin = Dog('金老板',100,500,'teddy') w = Weapon('打狗棒',100,3,998) # alex装备打狗棒 alex.money += 1000 alex.get_weapon(w) print(alex.weapon) print(alex.aggr) alex.attack(jin) print(jin.hp) alex.weapon.hand18(jin)# print(jin.hp) # 组合 :一个对象的属性值是另外一个类的对象 # alex.weapon 是 Weapon类的对象
alex.weapon.hand18(jin)#》》》相等于w.hand18(jin)
组合练习
# 圆形类 # 圆环类 from math import pi class Circle: def __init__(self,r): self.r = r def area(self): return self.r**2 * pi def perimeter(self): return 2*pi*self.r class Ring: def __init__(self,outside_r,inside_r): self.outside_c = Circle(outside_r) self.inside_c = Circle(inside_r) def area(self): return self.outside_c.area() - self.inside_c.area() def perimeter(self): return self.outside_c.perimeter()+self.inside_c.perimeter() # ring = Ring(20,10) # print(ring.area()) # print(ring.perimeter()) # 创建一个老师类 # 老师有生日 # 生日也可以是一个类 # 组合 class Birthday: def __init__(self,year,month,day): self.year = year self.month = month self.day = day class Course: def __init__(self,course_name,period,price): self.name = course_name self.period = period self.price = price class Teacher: def __init__(self,name,age,sex,birthday): self.name = name self.age = age self.sex = sex self.birthday =birthday self.course = Course('python','6 month',2000) b = Birthday(2018,1,16) egg = Teacher('egon',0,'女',b) print(egg.name) print(egg.birthday.year) print(egg.birthday.month) print(egg.course.price)
总结
# 面向对象编程
# 思想 :角色的抽象,创建类,创建角色(实例化),操作这些实例# 面向对象的关键字# class 类名:# 静态属性 = 'aaa'# def __init__(self):pass## 类名.静态属性 #—— 存储在类的命名空间里# 对象 = 类名() # 实例化:创造了一个self对象,执行init方法,返回self对象给外部# 对象.属性# 对象.方法 # 类名.方法(对象)# 对象可以使用静态变量? True# 类可以使用对象里的属性么? False# 组合
# 一个类的对象是另外一个类对象的属性# 什么有什么的关系# class A:
# def __init__(self):# self.name = 'egon'## class B:# def __init__(self,year,month,day):# self.year = year# self.month = month# self.day = day## b = B(18,1,17)# a = A()# a.birth = b# b.year# a.birthclass A:# def __init__(self):# self.name = 'egon'## class B:# def __init__(self,year,month,day):# self.year = year# self.month = month# self.day = day## b = B(18,1,17)# a = A()# a.birth = b# b.year# a.birth(作业)
角色:
学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供三个角色视图
6.1 学员视图, 登陆, 查看课程、查看班级
6.2 讲师视图, 讲师可查看自己教学的班级、课程。
进阶需求:可管理自己的班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里