封装
#
# 主题:封装
#
# 面向对象的三大特征
'''
封装:提高程序的安全性
# 将数据(即属性)和行为(即方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。
这样,无序关心方法内部的具体实现细节,从而脱离了复杂度
# 在 python 中没有专门的修饰符用于属性的私有,若该属性不希望在类对象外被访问,则在前面加两个"_"
继承:提高代码的复用性
多态:提高程序的可扩展型和可维护性
'''
class Student:
def __init__(self, name, age):
self.name = name
self.__age = age # age 只能在类的内部使用
def show(self):
print(self.name, self.__age)
if __name__ == '__main__':
stu = Student('张三', 20)
stu.show() # 张三 20
# print(stu.__age) # 报错,age 是 Student 类中的内部使用的属性,不能再类外直接访问
# dir 内置函数查看实例对象的属性和方法
print(dir(stu))
# 在类外访问那些只能在类内访问的属性
print(stu._Student__age) # 20
继承
#
# 主题:继承
#
# 若一个类没有继承任何类,则默认继承 object
# python 支持多继承
# 定义子类时,必须在其构造函数中调用父类的构造函数
# 定义父类
class Person(object): # 任何自定义类默认继承 object。object 可以不写
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print('姓名:{0},年龄:{1}'.format(self.name, self.age))
# 定义子类
class Student(Person): # Student 继承了 Person
def __init__(self, name, age, score):
super().__init__(name, age) # super 函数调用父类
self.score = score
class Teacher(Person):
def __init__(self, name, age, teachOfYear):
super().__init__(name, age) # 调用父类的方法
self.teachOfYear = teachOfYear
if __name__ == '__main__':
stu = Student('Jack', 20, '1001')
stu.info() # 姓名:Jack,年龄:20
teacher = Teacher('李四', 34, 10)
teacher.info() # 姓名:李四,年龄:34
# 多继承
class A(object):
pass
class B(object):
pass
class D(A, B): # D 类继承了 A 类和 B 类
pass
方法重写
#
# 主题:方法重写
#
# 若子类对继承自父类的某属性或方法不满意,可以在子类中其进行重新编写
# 子类重写后的方法中可以通过 super().xxx() 调用父类中被重写的方法
# 定义父类
class Person(object): # 任何自定义类默认继承 object。object 可以不写
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print('姓名:{0},年龄:{1}'.format(self.name, self.age))
# 定义子类
class Student(Person): # Student 继承了 Person
def __init__(self, name, age, score):
super().__init__(name, age) # super 函数调用父类
self.score = score
def info(self):
# 调用父类方法(若不调用,则实例对象的姓名和年龄不会输出)
super().info()
# 方法重写
print(self.score)
class Teacher(Person):
def __init__(self, name, age, teachOfYear):
super().__init__(name, age) # 调用父类的方法
self.teachOfYear = teachOfYear
if __name__ == '__main__':
stu = Student('Jack', 20, '1001')
stu.info() # 姓名:Jack,年龄:20
# 1001
# 子类 Student 重写了方法 info
object 类
#
# 主题:object 类
#
'''
object 类是所有类的父类,因此所有类都有 object 类的属性和方法。
内置函数 dir 可以查看指定对象的所有属性
Object 有一个 __str__() 方法,用于返回一个对于“对象的描述”,对应于内置函数 str()
经常用于 print 方法,帮我们查看对象的信息,所以我们经常对 __str__() 进行重写
'''
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return '我的名字是{0},今年{1}岁'.format(self.name, self.age)
if __name__ == '__main__':
stu = Student('张三', 20)
print(dir(stu))
print(stu) # 若对 __str__ 重写,则返回 我的名字是张三,今年20岁
# 若没有对 __str__ 重写,则返回 <__main__.Student object at 0x0000026109D20978>
# 输出的是对象的地址
print(type(stu)) #
在这里插入代码片