抽象类作业

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值