python特性——类(class)的分析

首先我们要明白最重要的一个概念——python中类是只是一个命名空间

        我们不要将class想的太神秘,要知道python为了遵从简单,简短的设计理念,对OOP进行了很多的阉割(这一点学习过C++、Java后很容易看出来),但保留了类设计理念框架。

        我们学习class时不妨将它看作一个特殊的命名空间(你可以把它理解为模块中的一个空间)我们所定义的那些乱七八糟的方法、属性全部都在这个空间里。

接下来我们要明白的是——class的搜索逻辑

        你可以想一想python在你写的普通代码中是怎样确定一个变量或函数(在同名的状况下)的调用。

        想好了这一点,class的搜索逻辑呼之欲出,《python学习手册》把它叫做“自下而上”。我用一个更通俗的说法:当前作用域(命名空间)找,找到了并且符合条件,就不再向外查找。找不到,去当前作用域(命名空间)的外部作用域(命名空间)再找,如此反复,直到找到为止。

        请大家记好这个概念。

划分class的各个部分

 最外层的(空间)

1.方法

        所有的在类内定义的方法,我们先有一个概念,它们是在最外层的,后面我会详细给大家分类。

2.全局属性

        官方、其他人并没有这个叫法,这是我编的,不过不要被吓到,听我解释。

        记得类只是一个命名空间的概念吗,我所谓的全局属性,就是在这个空间中定义的一个变量(就好像你重新打开了一个.py文件,在第一行写了一句 x = 1,这个x就是全局属性)

嵌在里面的(空间)

1.实例对象

        你可能非常震惊,事实不是这样的!!!是的你没有错,我这样说,只是为了给你一个想象的模型,听我继续扯皮。

        一个实例包含什么?其实只有数据(也就是每个对象独特的属性),和一些信息(比如它是属于哪个类的,有甚么函数可以调用)。

        明白了这些,我们不妨把实例想象成上面讲到的外层空间的里面又重新整了一个空间(就好像你在.py文件中整了一个函数,你在里面又写了一个x = 2,这个x你可以理解为示例中的属性)。

乱七八糟的方法

1.@staticmethod

        第一眼看到,什么勾八东西,一搜:装饰器。哇偶~不懂。

        这有关系吗,没有关系,学过C++、Java的一眼看出,这就是类的静态方法(你们可以忽略这一段了)。没学过的也不要怕,听我说,就是所有实例对象,哪怕是没有实例对象,通过类名也能调用的方法。意味着什么?意味着它独立于所有实例存在。

        这下你可能部分明白了我为什么将方法放到最外层的(空间),你能通过它访问内层的实例数据吗,当然不能。

2.@classmethod

        我一直觉得这是一个挺废物的设计,也就python有(不认同就是你对)。

        但我又想了想它能干吗,我想到了一个作用,就是管理我上面说的全局属性和生成实例对象。

        你想嘛,他是外层的访问不到内层的,就传了一个cls(表示自己是这个类的一个信息),它能干嘛,只能访问外层的对不对?全局属性自不必说,你想咋玩咋玩。方法呢?静态方法我自己就能调用,用得着你?那不就剩了一个__init__(构造函数)能用,哎~,这就是所谓的工厂方法,批量生成一些实例对象。

3.普通的方法

        你可能轻蔑一笑,这作者真没水平,普通的方法也划到外部空间去了,访问不了内部空间,明显与事实不符。

        别急,python不是强制你写了一个self吗,这个self就是让外部函数访问内部空间的钥匙(严谨一点来说就是把实例的数据传进去了),你通过这个self大杀四方,想咋用就咋用。(再多提一嘴,self就是一个名字,你甚至可以把self改为fles,重要的是位置要在第一个)

看到这里,你可能就明白了,怎样调用类中的各种函数。你可能会说,函数的多态性我还没有提,我想说:心急吃不了哥哥下的蛋,继承时我会讲的。

调用哪个?

        新手出征时,会被这些东西搞混,但请想一下我说的空间概念,和class的搜索逻辑。

        我们这里可以引入继承的概念了,当你有了一个子类对象时,它在访问属性时先访问到的是哪个空间呢,当然是子类对象的空间啦。

        这时能在子类对象空间找到的,肯定不会去基类对象空间去找,找不到的才会去,你用的是哪个属性、方法,看到这里,你还不明白?

        C++/Java人可能要多想了,万一这个类表面是父类实际是子类又会怎样?但你再仔细想一想,python传递的一直都是指针,而且没有类型的限制,不会有什么隐藏和截断,哪里他妈的会出现这种状况啊。

        我是这样理解的,所谓继承,不过就是子类的命名空间套在了基类的命名空间里罢了。再多就不必说了,大家都能推断出来了。

(敲不动了,不总结了,自个儿慢慢想哇)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值