【教程搬运】读懂github上的工程代码——各种魔法函数,从__init__开始

读懂github上的工程代码——各种魔法函数,从__init__开始

很多刚刚接触机器学习的小白,都不可避免地会遇到这样的问题,那就是必须从guthub上下载代码并复现,这着实会令人比较痛苦,因为网上的代码都是一套工程,你根本就不知道从何入手,怎么办呢?我们可以先铺垫一些基础知识,然后再通过一两个项目简单熟悉github上这些工程的结构,最后再把代码啃透去复现,这对于今后我们的科研道路是十分有帮助的。

如果您要继续往下读并且尝试自己的机器学习项目,请确保自己已经熟悉基本的Python语法,简单来说,就是能够利用anaconda搭建一个虚拟环境,会安装里头的各种包,并了解下面的知识:

  • 变量和简单的数据类型
  • 列表和元组
  • if语句和条件分支
  • 字典
  • 循环
  • 函数

推荐搞一本《Python编程,从入门到实践》,里面的前11章基本够用,可以去敲敲代码练习一下,但是,如果急着上手的话,简单阅读了解一下Python的语法,然后直接上手项目也未尝不可。

类和__init__函数

让我们从类和类的基本概念开始。推荐阅读下面的知乎回答。

Python中 __init__的通俗解释是什么? - 追远·J的回答 - 知乎
https://www.zhihu.com/question/46973549/answer/767530541

常识——不定长参数

推荐这个回答,里面详细地说明了*args和**kwargs。
https://zhuanlan.zhihu.com/p/70649428
而这个回答里是一个举例。
https://www.cnblogs.com/fengmk2/archive/2008/04/21/1163766.html

彻底搞懂Python中所有的魔法函数

推荐阅读这个回答。初看这个表不一定全都搞懂,后面慢慢理解就可以了。

Python中 __init__的通俗解释是什么? - 初识CV的回答 - 知乎
https://www.zhihu.com/question/46973549/answer/1682758202

这里面有几个魔法函数比较难以弄懂,我在这稍微做点批注。

__new__函数

这个函数的详细说明可以参见上面的知乎文章,我在这仅仅对其中的代码做一些批注。

class demoClass:
	#这个地方是定义一个变量,用于储存已创建实例的个数,注意它创建在类		 
	# demoClass当中,因此,后面的cls.instances_created就是指它。
    instances_created = 0
    def __new__(cls,*args,**kwargs):
    	#这是一个打印语句,打印出字符串,类名,变长参数和变长参数列表
        print("__new__():",cls,args,kwargs)
        #这是一种对于父类的继承,继承的是其中的__new__方法
        instance = super().__new__(cls)
        #把instances_created赋给instance.number,然后instances_created自		
        #身加1.
        instance.number = cls.instances_created
        cls.instances_created += 1
        #返回值是当时继承过程中创建的实例
        return instance
    def __init__(self,attribute):
    	#这个__init__方法里就两样东西最重要,一个是实例,一个是attribute
    	#(也就是下面那两个实例化当中括号内的字符串abc和abe)
        print("__init__():",self,attribute)
        self.attribute = attribute
test1 = demoClass("abc")
test2 = demoClass("xyz")
print(test1.number,test1.instances_created)
print(test2.number,test2.instances_created)

#输出结果
'''
__new__(): <class '__main__.demoClass'> ('abc',) {}
__init__(): <__main__.demoClass object at 0x0000025650FACF28> abc
__new__(): <class '__main__.demoClass'> ('xyz',) {}
__init__(): <__main__.demoClass object at 0x000002565FFC4CF8> xyz
0 2
1 2
'''

类似的,我们再来分析这个博客https://blog.csdn.net/wei18791957243/article/details/108719109中的代码,其中有一行非常耐人寻味return super(Check2, cls).__new__(cls, *args, **kwargs) ,他的目的显然也是在返回实例化的对象给__init__函数。

__unicode__函数

这个函数我也是仅分析代码。

class Demo(object):
        def __init__(self):
                self.a = 1
        def __unicode__(self):
        		#这个方法调用了__str__方法,把字符串里的非str类型都转换为了str,比如本题的self.a
                return f"the value is {
      
      self.a}"

print(unicode(Demo()))

我个人觉得用Django这样具体的场景讲解这个函数不太好,所以我建议看下面的博客https://segmentfault.com/q/1010000006121303。

注意,在Python3中,str与unicode的区别被废除了,这个函数已经不再存在,被__bytes__代替。

这个地方可以等遇到的时候慢慢查。

猜你喜欢

转载自blog.csdn.net/Michael_Cretu_/article/details/122855615