活动地址:CSDN21天学习挑战赛
Python安装完毕后释放了大量的文件,列表、元组等都是 builtins.py模块中定义的类。除此之外,开发者还可以使用class关键字创建类。类有两种类型,一种是可以实例化的类,另一种称为抽象类,在包含抽象方法的时候,不能实例化。
一.创建普通的类
与创建自定义函数类似,创建类也要使用关键词加类名、参数列表的形式。
class 类名([基类列表]):
属性名称
方法名称
如上所示,使用class创建普通的类。
1.创建类
class Chicken:
color="白色"
num="num1"
创建该类型的实例,只需使用类名加括号的形式,如上。使用class关键字定义类,可以提供一个可选择的父类或者说基类,如果没有合适的基类,就默认使用object作为基类。class行之后是可选的文档字符串、静态成员定义、方法定义。
2.创建实例
chicken=Chicken()
print("对象地址:",id(chicken))
print("对象类型:",type(chicken))
输入对象内存地址和对象类型,结果如下所示
对象地址: 2966030800720
对象类型: <class '__main__.Chicken'>
二、创建抽象类
创建抽象类需要从ABCMeta类继承,该类定义在abc模块中,该模块包含创建抽象类的修饰符。普通的抽象化可以实例化,如下所示
from abc import ABCMeta
class Poultry(metaclass=ABCMeta):
color="白色"
num="num1"
poultry=Poultry()
print("对象地址:",id(poultry))
print("对象类型:",type(poultry))
执行结果如下
对象地址: 1927195546608
对象类型: <class '__main__.Poultry'>
若是该抽象类包含了抽象方法,则不能实例化,如下
from abc import ABCMeta,abstractmethod
class Poultry(metaclass=ABCMeta):
color="白色"
num="num1"
@abstractmethod
def eat(self):
pass
@abstractmethod
def run(self):
pass
poultry=Poultry()
print("对象地址:",id(poultry))
print("对象类型:",type(poultry))
执行结果如下,出现类型错误异常
Traceback (most recent call last):
File "C:\practice.py", line 14, in <module>
poultry=Poultry()
TypeError: Can't instantiate abstract class Poultry with abstract methods eat, run
构造方法与析构方法
与大多数面向对象语言类似,Python的类也可以定义构造方法。销毁该类型的某个对象时,也可以自动调用析构方法。析构方法用于控制创建对象的方式,一般给对象设置初始值;析构方法用于控制销毁对象的方式,一般需要手动释放的系统资源。
如下,创建文件操作类。在第3行,使用_init_定义构造方法,并指定参数path。在_init_方法中,self是所有实例方法的第一个参数,也是默认参数,表示当前对象。因此第5行的含义就是给当前对象的_path属性设置初始值为path。_init_方法会在创建对象时自动调用。在第6行,调用open方法,打开path所指向的文件,并将返回的文件对象赋值给_f属性。在第8行,使用_del_定义析构方法,在该方法中判断文件对象是否关闭,若未关闭,则调用close方法。当使用del关键字删除该对象时,_del_方法也会自动调用。
class FileOperate:
def_init_(self,path):
print("自动调用_init_方法!")
self._path=path
self._f=open(path)
def_del_(self):
print("自动调用_del_方法!")
if not self._f.closed:
self._f.colse()
file_operate_obj=FileOperate(r"C:\pythonProject\1.txt")
del file_operate_obj
执行结果如下,输出构造方法与析构方法的执行过程
自动调用_init_方法!
自动调用_del_方法!