# 1.继承与抽象
# 抽取老师和学生中相同的部分形成person类

class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender

def say_hi(self):
print("name:%s,gender:%s,age:%s" % (self.name, self.gender, self.age))


class Teacher(Person): # 继承person类
def teaching(self):
print("老师教学生,写代码....")


t1 = Teacher("jack", "male", 20)
t1.say_hi()


class Student(Person):
pass


stu1 = Student("rose", "female", 18)
stu1.say_hi()

# 2.属性的查找顺序
# 对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object(到这一步时会报错,因为object存在与源代码之中,此时属性为空)
# type ctrl加右键查看它的源码你就明白了

# 3.派生与覆盖是继承
这两个是继承的两种情况

# 4.元素类型限制
"""
需求 实现一个能够限制元素类型的列表类

"""
class MyList(list):
def __init__(self,element_type):
super().__init__() # 调用父类的初始化方法 来完成基本的初始化
self.element_type = element_type

def append(self, object):
"""
:param object: 是要存储的元素
:return: 没有
"""
if type(object) == self.element_type:
#我们需要在这里访问父类的append函数来完成真正的存储操作
super(MyList,self).append(object)
else:
print("sorry sir, you element type not is %s" % self.element_type)


# 创建是指定要存储的元素类型
m = MyList(int)
# 当你有需求,是需要在创建对象时 干点什么事儿 那就该想到初始化方法

m.append(1)
print(m[0])
m.append("121212")

#4.字类访问父类
class Parent:
text = "abc"

def say_something(self):
print("anything")

class Sub(Parent):

def show_info(self):
# print(super(Sub,self).text)
# super(Sub,self).say_something()

# 访问方式2 py3的新语法 最常用的方式
print(super().text)
super().say_something()

#方式3 直接指定类名调用
# print(Parent.text)
# Parent.say_something(self)


# sub = Sub()
# sub.show_info()

# 5.初始化方法中的父类采用super()
class Person:
def __init__(self,name,gender,age,*args):
self.name = name
self.gender = gender
self.age = age
self.aa()

def aa(self):
print("aa run")


def say_hi(self):
print("name:%s ,gender:%s,age:%s" % (self.name,self.gender,self.age))


class Student(Person):

def __init__(self,name,gender,age,number):
super().__init__(name,gender,age)
self.number= number

def say_hi(self):
super().say_hi()
print("numnber:%s" % self.number)

stu = Student("rose","mael",20,"old01")
stu.say_hi()

# 6.组合
class Phone:
def __init__(self,price,kind,color):
self.price = price
self.kind = kind
self.color = color

def call(self):
print("正在呼叫XXXX;")

def send_message(self):
print("正在发送短信....")


class Student:
def __init__(self,name,gender,phone):
self.name = name
self.gender = gender
self.phone = phone

def show_info(self):
print("name:%s gender:%s" % (self.name,self.gender))

phone = Phone(1000,"apple","red")

stu1 = Student("rose","male",phone)
stu1.phone.call()

# 9.菱形继承(了解)
# py3 中是广域查找
# py2 中是深度查找
# py3中所有的类都是继承了源码中object的类,新式类
# py2中所有的类都不是继承源码中object的的类,旧式类