Python抽象类作业
1、抽象类和普通类的区别是什么?
答:抽象类的定义是为了实现多态性。和java中的接口相似,区别在于抽象类中可以定义属性,而接口是一个方法的集合。在抽象类中定义的方法,在其子类中必须要有同名称的方法,以此保证在继承中必须实现该方法。
普通类在继承中没有特定的要求,子类可以有父类中的方法,也可以不重新定义父类方法,直接调用父类的方法。
另外,抽象类不可以直接实例化。
2、python中实现抽象类需要导入什么方法?请实现一个抽象类,其中包含一个抽象方法。
答:需要导入abc模块的ABC 和abstractmethod 文件
from abc import ABC , abstractmethod
class abstract_class(ABC):
@abstractmethod
def func(self):
pass
class A(abstract_class):
def func(self):
print("继承了抽象类")
a = A()
a.func()
3、对抽象类的子类有什么关键需求?
答:必须定义抽象类中的方法。
4、声明抽象方法,抽象类方法,抽象静态方法的关键字是什么?
答:抽象方法:abstractmethod
抽象类方法:abstractclassmethod
抽象静态方法:abstractstaticmethod
5、给定类Student,具有属性score,请使用@property,使得score属性只能被赋值为整数且在0-100之间。如果输入不是整数,则提示“输入的不是整数”,如果输入的数不在0-100之间,则提示“输入的数不在0-100之间”。
class Student(object):
def __init__(self,score):
self.score = score
@property
def score(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value,int):
raise TypeError("输入的不是整数")
if value<0 or value>100:
raise IndexError("输入的数不在0-100之间")
self._score = value
stu = Student(101)
print(stu._score)
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-1-03016650f47c> in <module>()
16
17
---> 18 stu = Student(101)
19
20 print(stu._score)
<ipython-input-1-03016650f47c> in __init__(self, score)
1 class Student(object):
2 def __init__(self,score):
----> 3 self.score = score
4
5 @property
<ipython-input-1-03016650f47c> in score(self, value)
12 raise TypeError("输入的不是整数")
13 if value<0 or value>100:
---> 14 raise IndexError("输入的数不在0-100之间")
15 self._score = value
16
IndexError: 输入的数不在0-100之间
6、subclasshook
查看下列代码,写出运行结果,并体会subclasshook的用法。
import abc
class Base(abc.ABC):
@abc.abstractmethod
def protocol(self):
#自定义协议的抽象方法
pass
@classmethod
def __subclasshook__(cls,subclass):
if cls is Base:
if any("protocol" in B.__dict__ for B in subclass.__mro__):
return True
return NotImplemented
class MyImplementClass:
def protocol(self):
pass
if __name__=='__main__':
print(isinstance(MyImplementClass(),Base)) #True 类MyImplementClass实现了protocol方法,这在__subclasshook__中判定为True
print(issubclass(MyImplementClass