Python面对对象3

举报
Gere 发表于 2022/07/16 21:51:15 2022/07/16
【摘要】 抽象类概念:抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,需要借助python模块实现;抽象类是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法python中的abc模块python中需要利用abc模块实现抽象类import abc #利用abc模块实现抽象类c...

抽象类概念:

  • 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,需要借助python模块实现;
  • 抽象类是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
  • 抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法

python中的abc模块

  • python中需要利用abc模块实现抽象类

import abc #利用abc模块实现抽象类

class shuiguo(metaclass=abc.ABCMeta):
    
    all_type='sg'

    @abc.abstractmethod #定义抽象方法,无需实现功能
    def name(self):
        pass

    @abc.abstractmethod #定义抽象方法,无需实现功能
    def func(self):
        pass


class Apple(shuiguo): #子类继承抽象类,可是必须定义read和write方法
    def name(self):
        print('我是苹果')

    def func(self):
        print('好吃')

class Pear(shuiguo): #子类继承抽象类,可是必须定义read和write方法
    def name(self):
        print('我是梨子')

    def func(self):
        print('yunfeizhike')


apple =Apple()

pear=Pear()

apple.func()
pear.name()

print(pear.all_type)
print(apple.all_type)
  • 抽象类的本质仍是类,指的是一组类的类似性,包括数据属性(如all_type)和函数属性;
  • 抽象类是一个介于类和接口之间的一个概念,同时具有类和接口的部分特性
  • 为什么要做访问限制,

    做访问限制,是为了程序的健壮性。如果可以从外部对函数里面重要的属性进行任意修改,有可能程序崩溃只是因为一次不经意地参数修改。

    • 通过定义私有属性做访问限制

    默认情况下,可从外部访问对象的属性。若让属性不能从对象外部访问,可将属性定义为私有。
    私有属性只能通过存取器方法来访问
    Python没有为私有属性提供直接的支持,要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可

    class Apple(): 
        def name(self,name):
           self.__name = name
           
        def getName(self):
            return self.__name
    
    • 通过定义私有函数做访问限制;

    与属性一样,只需要在函数名前面添加两个下划线打头既可实现私有函数;

    class Apple(): 
        def __setAge(self,age):
           self.__age = age
           
        def getName(self):
            return self.__name
         
        def info(self,age):
        	self.__setAge(age);
         
    

    如上代码所示,提供了一个

    getName方法

    考虑到外部代码也需要获取类中的额私有变量,通过此方法提供了一个接口,外部代码可以通过此方法获取到私有变量

    __name

    同理,代码没有提供getAge方法,私有属性__age无法从外部代码获取;若需要从外部获取,需要提供以下方法;

     def getAge(self):
            return self.__age
    

    如上代码提供了info方法,用于在外部代码中给私有变量__age赋值,

    def info(self,aget):

    相比于直接给变量赋值,通过这种方式,可以对参数做检查,避免传入无效的参数,提升了代码的健壮性;

    def info(self,age):
    	if age < 1:
           raise ValueError('too small')
    	elif age > 100:
           raise ValueError('too big')
        else:
          self.__age = age
    

    双下划线开头的实例变量其实也不是一定不能从外部访问呢?

    apple = Apple()
    apple.info(10)
    print(apple.getAge())
    print(apple._Apple__age)
    

    运行以上代码,打印的是同样的值 :10

    不能直接访问双下划线开头的实例变量是因为Python解释器对外把__变量改成了_类名__变量名的形式;

    • 特殊情况:

    在Python中,以双下划线开头,并且以双下划线结尾的变量是特殊变量如__name__,特殊变量是可以直接访问的;
    按照约定俗成的规定,以一个下划线开头的实例变量名(例如_category) 外部也是可以直接访问的,但是这个形式的变量表达的意思是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。