python笔记——类
简单的类
在实际应用场景中,许多对象可能存在共性,于是可以将他们的共性给封装为一个类,这样在调用时就不用每次都重新定义。
# 定义一个类 ————人(人都有姓名、年龄)
class person():
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
print('The guy names %s'%self.name)
def get_age(self):
print("The guy's age is %s"%self.age)
上述定义了一个类————person,且在其中给定了共性:姓名、年龄,那么当需要定义一个这样的“人”时,就可以直接调用这个类:
# 通过person类来定义一个人——jay
jay = person('jay',18)
jay.get_name()
jay.get_age()
通过person即可定义,通过定义的方法可获取jay的姓名和年龄。
The guy names jay
The guy's age is 18
需要注意的是,在定义类的方法(函数)时,不要使用与类本身属性名称相同的函数名(比如存在属性name,则不要定义def name(self)。
父类和子类(继承)
由于简单的类并不能应用于所有的场景,每个人除了共性还有自己本身的特点,比如每个人的工作都不同。于是可以在共性的基础上继续细分,添加不同的特征来表示不同的类。
于是就有了基础的类:person和在此基础上建立的worker类,worker类也有name和age属性,于是就可以通过继承person类的方式进行,不需要再重新定义。
下面在上述person类的基础上添加“工作(job)”特征。
# 父类与子类
# 父类——person
class person():
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
print("The guy names %s"%self.name)
def get_age(self):
print("The guy's age is %s"%self.age)
# 定义子类——worker
# 子类继承自父类person
# worker是人,有名字和年龄
class worker(person):
def __init__(self,name,age,job):
# 继承父类的属性定义
# 写法1
# 父类.__init__(self,参数)
person.__init__(self,name,age)
# 写法2
# super(子类,self).__init__(参数)
# super(worker,self).__init__(name,age)
# 写法3——仅限用于Python3
# super().__init__(name,age)
# super().__init__(name,age)
# 定义子类本身的新属性
self.job = job
# 定义子类本身的方法(函数)
def get_job(self):
print("The guy is a %s"%self.job)
于是可以定义一个新的worker对象,在具有name和age属性的同时还具有job属性。
jay = worker('jay',18,'teacher')
# 获取属性
print(jay.name)
# 调用父类的函数
jay.get_name()
# 输出子类的新属性
print(jay.job)
# 输出子类的新方法
jay.get_job()
输出结果:
jay
The guy names jay
teacher
The guy is a teacher
继承时覆盖父类的方法
1、父类.方法(self,参数)
2、super(子类,self).方法(参数)
3、super().方法(参数)——只能用于Python3
在定义子类时,不仅可以定义本身的新方法,还可以对父类的方法进行重新定义,下面将person父类中的get_age给重新定义:
# 父类——person
class person():
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
print("The guy names %s"%self.name)
def get_age(self):
print("The guy's age is %s"%self.age)
# 定义子类——worker
# 子类继承自父类person
# worker是人,有名字和年龄
class worker(person):
def __init__(self,name,age,job):
# 继承父类的属性定义
# 写法1
# 父类.__init__(self,参数)
# person.__init__(self,name,age)
# 写法2
# super(子类,self).__init__(参数)
# super(worker,self).__init__(name,age)
# 写法3——仅限用于Python3
# super().__init__(name,age)
super().__init__(name,age)
# 定义子类本身的新属性
self.job = job
# 定义子类本身的函数
def get_job(self):
print("The guy is a %s"%self.job)
# 覆盖父类的函数定义
# def get_age(self):
# super().get_age()
# print("next year the guy's age is %s"%self.age)
# 对于子类的方法函数构造也可添加新参数
def get_age(self,year):
super().get_age()
print("next year the guy's age is %s"%self.age)
print(year)
def main():
jay = worker('jay',18,'teacher')
# 获取属性
print(jay.name)
# 调用父类的函数
jay.get_name()
# 输出子类的新属性
print(jay.job)
# 输出子类的新方法
jay.get_job()
# # 未添加新参数
# jay.get_1age()
# 添加了新参数
jay.get_age(2020)
if __name__ == "__main__":
main()
输出结果:
jay
The guy names jay
teacher
The guy is a teacher
The guy's age is 18
next year the guy's age is 18
2020
且可以发现,在重新定义父类方法时还可以添加新的参数,添加新的参数后在使用时需要将其写入。