python常用类方法(魔法方法)

在谈论类方法前,我们先理解几个概念:

  • 鸭子类型
  • 协议
鸭子类型

python是动态的面向对象语言,动态意味着只有在运行时才能确定对象的类型,面向对象语言意味着带有面向对象的三大特性(继承、封装、多态)。
那么我们如何认定一个对象的类型呢?
我们不关注对象的类型,而是关注对象的方法(行为)。
如果它的行为是鸭子的行为,那么就可以认为它是鸭子。

协议

概括来讲,协议是让python这种动态语言实现多态的方式。
简单来说,协议是一组方法,当我们在类中实现了特定的方法,也就是遵守了协议。

结合我们刚刚讲的“鸭子类型”来看,“如果它的行为是鸭子的行为,那么就可以认为它是鸭子。”。
举个例子,比如我有一个图书馆,有三本书,那么我如何迭代他们呢?
中心思想:我应该在类中实现getitem方法。

class Library(object):
    def __init__(self):
        self.books = [{'book1': 'a'}, {'book2': 'b'}, {'book3': 'c'}]

    def __getitem__(self, index):
        print("index:{}".format(index))
        return self.books[index]

getitem方法其实就是告诉Library对象如何获取book。

然后我们遍历一下。

library = Library()
for book in library:
    print(book)
image.png

总结一下这个例子:
我们通过getitem方法,让Library对象可被迭代,python中的很多魔法方法(双下滑线开始和结尾的方法)都有类似的功效。
那么,接下来我们一个一个来测试,不断探索python中的魔法方法。


_init_ & _new_

init和new方法会在一个对象创建和初始化的时候调用,二者有紧密的联系。
从对象的声明周期来看,在创建对象阶段,首先会调用new方法,他会开辟内存,建立实例对象与内存的联系。
然后调用init方法,对创建了对象进行赋值。
比如下面的例子:

class Test:
    def __init__(self, value):
        self.value = value
        print("调用了init方法")

    def __new__(cls, *args, **kwargs):
        print("调用了new方法")
        return super(Test, cls).__new__(cls)


t = Test('value')
print(t.value)
image.png

需要注意,由于new方法是对象的构造方法,所以需要return一个实例,这个实例是由super方法生成的实例并调用了new方法得来的。

未完待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,907评论 1 32
  • 高阶函数:将函数作为参数 sortted()它还可以接收一个key函数来实现自定义的排序,reversec参数可反...
    royal_47a2阅读 4,088评论 0 0
  • 1/579文件IO文件介绍I/O流流的概念读写文件文件备份IO介绍大家应该听说过一句话:“好记性不如烂笔头”。不仅...
    清清子衿木子水心阅读 5,370评论 0 1
  • 让每个从寒冬 走向春天的人 与春共舞 春色永驻 鲜花常开
    静轩茶香阅读 1,391评论 0 1
  • R:如果熟悉帮主的人都知道,帮主有个线上课,内容讲如何拆书以及如何系统化管理拆书知识。课上帮主提到,知识的获取除了...
    豆妈成长阅读 1,189评论 0 0

友情链接更多精彩内容