python中的魔法属性和方法 一

__doc__

模块本身是一个对象,而每个对象都会有一个__doc__属性。该属性用描述该对象的作用。

#__doc__的作用
class Demo(object):
"""这是一个简单的例子"""
def test(self):
    """这是一个实例对象的方法"""
    print("life is short,you need python!")

def test2(self):
    print("never old to lenrn")


print(Demo.__doc__)
print(Demo.test.__doc__)
print(Demo.test2.__doc__)

输出结果如下:

这是一个简单的例子
这是一个实例对象的方法
None

即会输出对这个对象的描述信息,如果没有给对象设置描述信息,则会返回None

__name__

经常都在使用if __name__ == ‘__main__’:,那么这句话到底是什么意思,__name__又有什么含义呢?来看一个例子:创建一个名字为test.py 的文件

def test_fun():
if __name__ == '__main__':
    print('I am in my domain,my name is %s' % __name__)

else:
    print('Someone else calls me!,my name is %s' % __name__)

test_fun()

运行结果为:

I am in my domain,my name is __main__

再继续创建一个程序名字为import_test.py文件,在这个程序里面将test.py当做一个模块来导入使用,如下:

import test

test.test_fun()

运行结果如下:

Someone else calls me!,my name is test
Someone else calls me!,my name is test

你会发现,Someone else calls me!,my name is test被打印了两遍,第一次打印是在import test的时候,第二次打印是在执行test.test_fun()的时候打印的。以上两个程序,打印出来的__name__的结果不一样,从之前的__main__变成了test。__name__这个系统变量显示了当前模块执行过程中的名称,如果当前程序运行在这个模块中,__name__ 的名称就是__main__如果不是,则为这个模块的名称。

__module__和__class__

__module__表示当前操作的对象在哪个模块
__class__表示当前操作的对象是由哪个类创建的
创建一个test.py文件

class Person(object):
    def __init__(self):
        self.name='laowang'

在创建一个main.py文件

from test import Person

boj=Person()
print(obj.__module__)
print(obj.__class__)

输出结果为:

test
<class 'test.Person'>

分别打印出当前对象所在模块名和当前对象是由哪个类创建的

__init__和__new__

__new__ 用来创建一个对象的时候自动调用的方法,__init__为对象初始化的时候自动调用的方法。二者有什么不同呢?执行顺序是什么呢?请看例子:

class Person(object):
    def __new__(cls, name, age):
        print('__new__ called.')
        return super().__new__(cls)

    def __init__(self, name, age):
        print('__init__ called.')
        self.name = name
        self.age = age

if __name__ == '__main__':
    piglei = Person('piglei', 24)
    print(piglei)

运行结果为:

__new__ called.
__init__ called.

可以发现,在创建一个对象的时候,是先执行__new__方法,然后再去执行__init__方法,new是创建对象,init是对这个对象进行初始化操作

猜你喜欢

转载自blog.csdn.net/weixin_40612082/article/details/80779547