class Person:
# 父类或者基类
# 如果在类定义中没有指定父类,则默认父类是 object 类。也就是说,object 是所有类的父类,里面定义了一些所有类共有的默认方法,比如:__new__()。
def __init__(self, name, age, height):
# 在一个类中可以建立两个构造函数__init()吗?可以,但是写在上面的会被下面的重写,上面的会失效,一般不这样写。
self.name = name
self.__age = age
# ·__xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问。
# (但在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python不存在严格意义的私有成员)
self.height = height
def say_age(self):
print(self.name+'的年龄是:'+str(self.__age))
def say_name(self):
print("我是"+self.name)
def __super(self):
return '超人'
def say_height(self):
print('身高{}'.format(self.height))
class Student(Person): # 子类或者派生类,继承Person类
def __init__(self, name, age, score, height):
self.score = score
Person.__init__(self, name, age, height)
# 构造函数中包含调用父类构造函数。根据需要,不是必须。子类并不会自动调用父类的__init__(),我们必须显式的调用它
# 定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下:父类名.__init__(self, 参数列表)
def say_name(self): # 重写父类的方法
print("报告老师,我是" + self.name)
Person.say_name(self) # 在子类中直接调用父类实例方法(方式1)
super().say_name()
# 通过super()在子类中调用父类实例方法(方式2)
# 在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。super()代表父类的定义,不是父类对象。
def say_score(self):
print(self.name+'的分数是:', str(self.score))
def hobby(self):
return '爱好是Boxing'
@staticmethod
def hobby_static():
return '爱好是swimming'
@property # @property装饰器 可以将一个方法的调用方式变成“属性调用”
def job(self):
return '职业是Freedom'
def nationality():
# 定义一个外部函数。测试为类添加该方法。Python是动态语言,可以动态的为类添加新的方法,或者动态的修改类的已有的方法。
print('国籍为中国')
def hobby2(self):
# 定义一个外部函数hobby2,测试替换Person中的hobby方法。注意名称须为hobby**,否则无法识别
return '爱好是散打'
s1 = Student('孙行者', 18, 100, 186)
s1.say_age() # 调用父类的实例方法say_age()
s1.say_name() # 调用子类本身的实例方法
s1.say_score() # 调用子类本身的实例方法
print(s1.hobby()) # 打印返回值
print(Student.hobby_static())
Student.hobby = hobby2 # 用外部函数hobby2,测试替换Person中的hobby方法
print(s1.hobby())
s1.nationality = nationality # s1动态新增nationality方法
s1.nationality() # 新增后调用方法
print(s1.job) # @property主要用于帮助我们处理属性的读操作、写操作。
print(dir(s1)) # dir(obj)可以获得对象的所有属性、方法
print(s1._Person__age) # 通过“对象名. _类名__属性名()”在类外部访问私有属性
print(s1._Person__super()) # 通过“对象名. _类名__方法名()”在类外部访问私有方法
print(Student.mro()) # 查看类的继承层次结构