Python学习笔记(十八):

  1. 成员修饰符
  2. 特殊成员
  3. 原始类,metaclass
  4. 异常处理
  5. 反射
  6. 单例模式
  7. 本周作业

1. 成员修饰符

  • 共有成员经过成员修饰符修饰之后变为私有成员
  • 私有成员无法在外部直接访问,只能通过内部访问后传给外部

  • 代码示例

class Foo:
def __init__(self, name, age):
self.name = name
self.__age = age # 用成员修饰符修饰的字段

def show(self):
# 通过成员修饰符修饰的字段在外部无法直接读取
# 只能通过内部函数读取后输出
print(self.__age)

obj = Foo('alex', 19)
print(obj.name)
obj.show()

2. 特殊成员[部分]

  1. init 类()自动执行
  2. call对象()或类()()自动执行
  3. __int__int(对象)
  4. __str__str()
  5. dict将对象中封装的所有内容通过字典的形式返回
  6. getitem用于索引操作,如字典。表示获取数据
  7. setitem用于索引操作,如字典。表示设置数据
  8. delitem用于索引操作,如字典。表示删除数据

3. 原始类,metaclass

  • Python中一切事物都是对象

4. 异常处理

try:

except:

else:

finally:

5. 反射

  • 通过字符串增删改一个对象的成员
obj = Foo('alex', 18)
b = 'name'
print(obj.__dict__)
print(obj.__dict__[b])

inp = input('>>:')
v = getattr(obj, inp)
r = v()
print(r)

# hasattr(obj, 'name') 判断是否存在

# setattr(obj, 'k1', 'v1') 设置一个新的成员

# delattr(obj, 'k1') 删除成员

6. 单例模式

  • 永远使用同一份实例(对象)
# 原理简介
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age

def show(self):
print(self.name, self.age)

v = None
if v:
v.show()
else:
v = Foo('alex', 20)
v.show()

# 实现方法
class Foo:
__v = None

@classmethod
def get_instance(cls):
if cls.__v:
return cls.__v
else:
cls.__v = Foo()
return cls.__v

# 不要再使用 类() 的方法创建对象,直接用下面的方法
obj1 = Foo.get_instance()
print(obj1) # <__main__.Foo object at 0x000002438B957A58>
obj2 = Foo.get_instance()
print(obj2) # <__main__.Foo object at 0x000002438B957A58>
obj3 = Foo()
print(obj3) # <__main__.Foo object at 0x000002438B957A90>
obj4 = Foo()
print(obj4) # <__main__.Foo object at 0x000002438B957B00>

7. 本周作业:选课系统

角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供两个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里