Python面对对象3
抽象类概念:
- 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,需要借助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) 外部也是可以直接访问的,但是这个形式的变量表达的意思是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”
- 点赞
- 收藏
- 关注作者
评论(0)