# 面向对象 类
'''
特点:
1.构造方法:需要重写 __init__方法
2.对象属性:需要在 __init__ 方法中通过 self.属性名称 去定义
3.获取对象的字符串信息: 需要重写 __str__ 方法
4.定义对象的方法时:可以通过self.属性名去获取对应的属性名
'''
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.__secret = "这是一个秘密"
# 相当于Java中的toString方法
def __str__(self):
return '\t'.join(["Person", self.name, str(self.age)])
def skill(self):
print(self.name + "能够直立行走...")
def get(self):
print(self.__secret)
person1 = Person("张三", 24)
print(person1, type(person1))
print(person1.age)
print(person1.name)
person1.skill()
person2 = Person("李四", 48)
person2.get()
# print(person2.__secret) # 内部属性不能被外部对象访问
print(person2._Person__secret) # 内部属性可以通过 _+类名+内部属性名进行访问
# 继承
'''
特点:
1.如果一个新的类继承了已有的一个类,那么被继承的类叫 父类,新的类叫做子类
2.范围大的一般被用来做父类,具体的一般用来做子类
3.子类可以调用父类中的方法及属性
4.如果子类中的函数与父类重名,则调用子类方法
'''
class Teacher(Person):
def __init__(self, t_name, t_age):
# 如果需要构建父类对象,需要传入父类中所需的参数,并且super中需要传入子类名称及其self
super(Teacher, self).__init__(name=t_name, age=t_age)
self.teach = "computer"
def skill(self):
print("可以搞大数据...")
t = Teacher("杨老师", 30)
print(t.name)
t.skill()
t.get()
class Student(Person):
def __init__(self, t_name, t_age):
super(Student, self).__init__(name=t_name, age=t_age)
self.teach = "王者"
def skill(self):
print("可以打王者荣耀...")
s = Student("王同学", 20)
s.skill()
'''
多态:
1.可以通过对象的引用调用其方法
2.父类引用指向子类对象
3.Python中并不注重是否继承及检查类型,只注重有没有方法及属性
'''
#定义run方法调用person类skill方法
def run(person):
person.skill()
person3 = Person("王", 40)
run(person3)
teacher3 = Teacher("覃老师", 28)
run(teacher3)
# 鸭子类
class Duck:
def skill(self):
print("鸭子可以游泳...")
duck1 = Duck()
run(duck1) #duck类没有继承person类但duck类中有skill方法也可以用run方法调用
# 猴子补丁
class Dog:
pass
# 创建一个函数
skill_functioni = lambda: print("是人是狗都在秀...")
dog1 = Dog()
# 将函数赋值给dog作为dog新增的补丁方法
dog1.skill = skill_functioni
dog1.skill()
# 模块
'''
特点:
1.导入模块时,会去执行模块中的代码块
2.模块的两种导入方法1. import 包.模块 2. from 包 import 模块
3.方法和模块导入方式一致 from 包.模块 import 方法名
4.指定的方式是采用 import 模块 as 别名
5.import 模块会自动调用模块内的方法,方法在if __name__ == '__main__':中必须手动调用
'''