Python学习日记 Day11类与对象(下)

今天是2020年2月20日,晴,6~14℃

一、继承

继承是一种创建新类的方式。新建类将获得原有类的所有属性和方法。原有的类称为父类(超类),新建的类称为子类。
Python中继承的方式如下:

'''
class ClassName(Base):
	<statement>
'''
class Person():		#父类
	'''Person类的属性和方法'''

class Student(Person):		#子类
	'''Student类特有的属性和方法'''
1、子类的 init 方法

创建子类实例时,首先需要创建出一个父类实例,为父类的属性赋值。因此父类中若不存在不需要参数的 Init 方法,则子类的 init 方法必须为父类的提供参数。

class Person():				#父类
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
class Student(Person):		#子类
    def __init__(self,name,age,gender):
        super().__init__(name,age,gender)		#初始化父类

如上,在子类的 init 方法中调用了特殊的 super 函数,获取父类,从而显式调用父类的 init 方法。此外,super 函数还可以用于调用父类的属性和方法。

2、定义子类的属性和方法

让一个类继承另一个类后,可添加子类特有的属性和方法。

class Student(Person):
	def __init__(self,name,age,gender,grade,stu_id):
        super().__init__(name,age,gender)		#初始化父类
        self.grade = grade			#特有属性grade
        self.stu_id = stu_id		#特有属性stu_id
    def print_stu_id(self):			#特有方法print_stu_id
    	print(self.stu_id)

你可以根据所需添加任意数量的属性和方法。但注意,若一个属性和方法是父类拥有的,应加入父类中;只有当这个属性和方法只属于子类时才加入子类中。

3、重写父类方法

如果父类的方法不符合需求,就可对其进行重写。为此,可在子类中定义一个方法,与要重写的父类方法同名的。这样,在程序运行时Python就不会考虑父类的方法,而使用子类的方法。

class Person():
	def print_info(self):		#原有方法
		print("Name: " + self.name)
		print("Gender: " + self.gender)
		print("Age: " + self.age)

class Student(Person):
	def print_info(self):		#重写
		print("Studnet ID: " + self.stu_id)
		print("Grade: " + self.grade)
		print("Name: " + self.name)
		print("Gender: " + self.gender)
		print("Age: " + self.age)

person_1 = Person("Alex",18,"Male")
student_1 = Student("Alex",18,"Male",7,20200220)
print("This is a person:")
person_1.print_info()
print("This is a student:")
student_1.print_info()
'''
Output:
This is a person:
Name: Alex
Gender: Male
Age: 18
This is a student:
Studnet ID: 20200220
Grade: 7
Name: Alex
Gender: Male
Age: 18
'''

不同于C++中的重写需要函数名,参数表和返回类型均相同,Python中重写只要方法名相同。

4、以实例为属性

当一个类内的属性和方法过多时,可以将其中一部分作为另一个类提出,并将其作为大类的属性。

class Battery():		#电池类
	def __init__(self,type_,size):
		self.type_ = type_
		self.size = size
	def print_type(self):
		print(self.type_)
	def print_size(self):
		print(self.size)

class Computer():		#电脑类
	def __init__(self,battery_type,battery_size,mouse_type,keyboard_type,screen_type):
		self.battery = Battery(battery_type,battery_size)		#电池实例作为电脑的属性
		self.mouse_type = mouse_type
		self.keyboard_type = keyboard_type
		self.screen_type = screen_type

二、导入类

与函数类似,类也可以存入模块中,然后在主程序中导入相应模块。

1、创建模块

在项目中新建一个名为person.py的的文件,并加入类的定义。

#person.py
class Person():
	'''人类'''
    def __init__(self,name,age,gender):
    	'''	构造器'''
        self.name = name
        self.age = age
        self.gender = gender
    def print_info(self):
    	'''输出人的信息'''		
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))

class Student(Person):
	'''学生类'''
    def __init__(self,name,age,gender,grade,stu_id):
    	'''构造器'''
        super().__init__(name,age,gender)
        self.grade = grade
        self.stu_id =stu_id
    def print_info(self):	
    	'''输出学生的信息'''	
        print("Studnet ID: " + str(self.stu_id))
        print("Grade: " + str(self.grade))
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))

这样,一个简单的类模块就完成了。

2、导入类

跟导入函数一样,导入类也有多种方式,可以根据需要选用。

● 导入单个类
from person import Student	#from module_name import ClassName
● 导入多个类
from person import Person, Student	#from module_name import ClassName1, ClassName2, ...

与导入函数相同,也可以使用 as 关键字为类指定别名。

● 导入所有类
from person import *	#from module_name import *

以上三种方法均不需要使用句点表示法。

● 导入整个模块
import person

这种导入方法很简单,代码也易于阅读,不会与当前文件使用的任何名称发生冲突。

导入类的方式和导入函数基本一致。同样,导入类时也不推荐使用导入所有类的方法。一般来说,要么导入整个模块使用句点表示法,要么导入需要的类和函数。

● 在模块中导入模块

有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。 在这种情况下,可在前一个模块中导入必要的类。

#person.py
class Person():
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
    def print_info(self):		#原有方法
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))

#student.py
from person import Person
class Student(Person):
    def __init__(self,name,age,gender,grade,stu_id):
        super().__init__(name,age,gender)
        self.grade = grade
        self.stu_id =stu_id
    def print_info(self):		#重写
        print("Studnet ID: " + str(self.stu_id))
        print("Grade: " + str(self.grade))
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))
#main.py
import student
person_1 = student.Person(...)
student_1 = student.Student(...)

在导入一个模块后,也可以使用在这个模块里导入的模块。调用的方式取决于模块中导入模块的方式和主程序中调用模块的方式。
例如:若都导入整个模块,则需要使用两次句点表示法;若都导入指定类,就不需要句点表示法。

3、Python标准库

在学习如何使用类和导入类后,可以开始使用Python自带的标准库了。Python标标准准库库 是一组模块,安装的Python都包含它。可使用标准库中的任何函数和类,为此 只需在程序开头包含一条简单的import 语句。
查询标准库:http://pymotw.com/https://docs.python.org/zh-cn/3/library/index.html

还可以从其他地方下载外部模块使用。

三、类编写规范

1、类名应使用驼峰命名法,即每个单词的开头字母大写。实例名和模块名使用下划线法。
2、对于每个类,都应在定义后紧跟一个文档字符串,简要阐述类的功能。
3、对于每个模块,也应包含一个文档字符串,介绍模块内的类可做什么。
4、在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
5、需要同时导入标准库中的模块和你编写的模块时,先导入标准库模块的import 语句,再添加一个空行,然后导入你自己编写的模块的import 语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值