blubiu

My Love

上网不网恋,简直浪费电.


Python从0到POC编写--魔法方法


前言:

Python POC编写 的第三篇 ,

魔法方法。


目录:


name

__name__ 是系统定义的内部函数,

它的作用是识别模块。

通常我们看到这样一句话:

if __name__ == '__main__'

__name__ 的值有两种情况,那么挨个来说下。


如果模块是被直接执行的 ,那么 __name__ 的值 为 __main__

例如:

def test():
    print '__name__ = '__name__
if __name__ == '__main__':
    test()

定义一个 test() 函数,

那么这个函数是被执行的,

__name__ 就会变为 __main__

images


如果模块是被导入的,那么 __name__ 的值 为 模块的名字,

例如:

import sys
def test():
    print '__name__ = '__name__
if __name__ == '__main__':
    test()

使用 import函数 导入sys模块,

__name__ 的值 就是 sys


main

__main__ 是顶层代码执行的作用域的名称。

模块的 __name__ 在通过标准输入、脚本文件或是交互式命令读入的时候会等于 __main__

模块可以通过检查自己的 __name__ 来得知是否运行在 main 作用域中。

__main__ 一般跟 __name__ 连用,不会单独使用。


init

__init__ 方法是一个特殊的方法(init是单词初始化initialization的省略形式),

它的作用是在使用类创建对象之后被执行,用于给新创建的对象初始化属性用。

举个粟子:

class test:
    def __init__(self, n, a):
        self.name = name    #  初始化属性
        self.age = age      #  初始化属性
        print("test")

self 表示对象本身,谁调用,就表示谁,

na 是自定义的变量名称,随便取啥都行。

这里 self.name = nself.age = a 表示将外部传来的 na ,赋值给self对象的 nameage 属性。

举个粟子:

>>> man = test("小明",18)  #  实例化对象
>>> test  #  输出 test ,说明在创建类的实例的时候,__init__ 方法就立马被调用了。
>>> self.name
>>> '小明'
>>> self.age
>>> '18'

这里面,小明就是 n18 就是 a

在实例化对象的时候将他们分别赋值给 na


module

__module__ 表示当前操作的对象在那个模块

此方法也有两个不同的结果。


如果当前模块为被调用模块的时候 打印当前模块的名称

例如:

class Person(object):
    def __init__(self):
        self.name = '张三'
 
 
from test import Person   #  从另一个文件中导入类Person
 
obj = Person()
print(obj.__module__)    #  输出 test 即 输出模块

如果当前模块为顶层模块执行 则打印 __main__

例如:

def test():
    pass

print(test.__module__)   #  打印 __main__

str

如果要把一个类的实例变成 str ,就需要实现特殊方法 __str__

python在调用 print() 打印实例化对象时,

会调用 __str__() 方法 ,如果 __str__() 方法中有返回值,就会打印其返回值。

__str__ 方法 使用 return 作为返回值,而不是 print

例如:

class test:
    def __init__(self,name,age):
        self.name = name
        self.age = age 
    def __str__(self):
        return "我是 __str__ 方法"   #  实例化对象的时候有 return 会打印返回值
if __name__=="__main__":
    demo = test("张三",18)   #  实例化对象
    print(demo)

总结

第三篇 完。

感觉后续还需要补充一些。