大家好,我是小K。
前些日子看到有粉丝对以前《Python每天3分钟》系列中的代码存疑,希望我们能讲解下相关代码概念。
今天,他来了!!!!!
往期快速传送门:
谁说Python没有真正的私有变量?三分钟理解__getattribute__函数【#079】
粉丝问题:

相关代码:
class Maiyou:
def __init__(self,name, age, id_no):
self.name=name
self.age=age
self.id_no = id_no #深证号码
def __getattribute__(self, item):
"""所有以id开头的属性都不能直接访问"""
if item.startswith('id'):
return '隐私属性,不能直接访问'
return object.__getattribute__(self,item)
m1 = Maiyou('Kevin', 18, '1234567890')
print(m1.name)
print(m1.age)
# 这一行拦截访问!
print(m1.id_no)
解答:
我们先把粉丝的问题分成两个部分:
-
object.__getattribute__, 是不是应该写成self.__getattribute__? -
object哪里来的?
先解答第一个问题
如果你在__getattribute__方法中返回self.__getattribute__(item),会导致无限递归。
因为它的执行顺序会是这样:
如果传入item符合if条件语句为True的还好,如果为False就会递归下去,造成RecursionError


再解答第二个问题
先说概念,在Python中,object是所有类的基类,也就是说,每个类默认都继承自object类。
在上面的代码中,我们把继承object的语句省略(Python2.x不能省略)。
先补全类继承的代码:
我们可以先简单理解类继承的概念,如果我有个类继承一个别的类,我就隐性拥有了这个别的类的一切,继承的是子类,被继承的为父类。
在Python中,如果子类觉得它不满意父类的一些“特点”,就可以重修父类的一些属性和方法。
只要在子类中命名同样的变量就能实现覆盖父类的属性和方法,就能就行重修。

重修之后发现,子类还是希望能用到父类的同样的方法,但是在子类中已经被覆盖重修掉了,那怎么办?
那么需要指定父类的名字,让指定的父类把方法再借来用就行了。

怎么理解这个关系呢??
老爹 (父类) 擅长修摩托车,但儿子 (子类) 擅长修汽车。儿子开了一家维修店。
如果客户是开摩托车进店的,会判断给老爹修;如果是汽车,则会判断给儿子去修理。
这样老爹不用去学修汽车,儿子不用再去学修摩托车,就能维修两个种类的车。

最后
希望本文能对Matt粉丝有帮助。
此外如果大家对麦叔编程公众号中的其他代码有疑惑,也可以提出来,大家一起交流学习。

评论0