# 封装
# 对外部隐藏具体的实现细节, 只提供简单的调用接口, 如USB接口
# 在类中, 用双下划线, 封装属性或方法, 外部不能调用, 不能继承
# 例:
def __test(self): # 私有方法
pass
__name = 'lee' # 私有属性
# 继承
# 将一些共同代码抽取成一个类, 需要用的继承就可以, 就可以在自己的类里面使用
# 实现代码的复用, 减少代码冗余
# 例:老师和学生都是人,都会吃饭和睡觉.
class Person:
def eat(self):
print('eat')
def sleep(self):
print('sleep')
class Student(Person):
pass
class Teacher(Person):
pass
# 多态
# 一个类或方法, 会根据调用者的不同, 产生不同的结果.
#例
print(type('str'))
print(type(123))
# 组合
# 由于类和类之中可能不存在关联关系, 所以不能继承, 这时就可以用组合
# 将一个类的实例, 以参数的形式传入另一个类中, 这样, 另一个类的对象, 通过实例, 就可以直接调用实例中的方法或属性
# 如: 学生和手机, 学生拥有手机, 但学生不是手机, 所以, 就可以用组合
#
# 例:
#
# 创建电话类
class Phone:
def send_text(self):
print('send_text')
# 创建学生类
class Student:
# 让学生拥有电话
def __init__(self, name, phone):
self.name = name
self.phone = phone
# 创建电话
phone = Phone()
# 创建学生,并将电话传给学生
stu = Student('lee', phone)
# 学生就可以用电话发短信了
stu.phone.send_text()
# 反射机制
class Person:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
p = Person("jack",18,"man")
# print(p.name)
# print(hasattr(p,"name"))
# if hasattr(p,"name"): # 判断某个对象是否存在某个属性
# print(getattr(p,"names",None)) # 从对象中取出属性,第三个值位默认值 当属性不存在是返回默认值
# 为对象添加新的属性
setattr(p,"id","123")
print(p.id)
# # 从对象中删除属性
# delattr(p,"id")
# print(p.id)
print(getattr(p,'gender'))