object原来可以这么用

大家好,我是小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)

解答:

我们先把粉丝的问题分成两个部分:

  1. object.__getattribute__, 是不是应该写成self.__getattribute__?
  2. object哪里来的?

先解答第一个问题

如果你在__getattribute__方法中返回self.__getattribute__(item),会导致无限递归。

因为它的执行顺序会是这样:图片

如果传入item符合if条件语句为True的还好,如果为False就会递归下去,造成RecursionError

图片
符合if条件语句为True
图片
符合if条件语句为False

再解答第二个问题

先说概念,在Python中,object是所有类的基类,也就是说,每个类默认都继承自object类。

在上面的代码中,我们把继承object的语句省略(Python2.x不能省略)。

先补全类继承的代码:图片

我们可以先简单理解类继承的概念,如果我有个类继承一个别的类,我就隐性拥有了这个别的类的一切,继承的是子类,被继承的为父类

在Python中,如果子类觉得它不满意父类的一些“特点”,就可以重修父类的一些属性方法

只要在子类中命名同样的变量就能实现覆盖父类的属性方法,就能就行重修。

图片

重修之后发现,子类还是希望能用到父类的同样的方法,但是在子类中已经被覆盖重修掉了,那怎么办?

那么需要指定父类的名字,让指定的父类把方法再借来用就行了。

图片

怎么理解这个关系呢??

老爹 (父类) 擅长修摩托车,但儿子 (子类) 擅长修汽车。儿子开了一家维修店。

如果客户是开摩托车进店的,会判断给老爹修;如果是汽车,则会判断给儿子去修理。

这样老爹不用去学修汽车,儿子不用再去学修摩托车,就能维修两个种类的车。

图片

最后

希望本文能对Matt粉丝有帮助。

此外如果大家对麦叔编程公众号中的其他代码有疑惑,也可以提出来,大家一起交流学习。

原文链接:https://www.zsiss.com/9325.html,转载请注明出处。
0

评论0

请先
文章软件下载知识付费网站模板zs31603
文章软件下载知识付费网站模板zs31603
1分钟前 有人购买 去瞅瞅看

社交账号快速登录