zoukankan      html  css  js  c++  java
  • 双下划线函数

    __doc__

    __doc__:文档字符串,模块本身是一个对象,而对象都会有一个__doc__属性,该属性用于描述该模块的作用。

    范例:

    class People:
        """描述人的一个类"""
        def __init__(self):
            pass
    people=People()
    print(people.__doc__)

    结果:

    描述人的一个类

    范例二:

    class People:
        def __init__(self,name):
            """
            这个函数是描述人的名字
            :param name: 人的名字
            """
    
            pass
    people=People("小红")
    print(people.__init__.__doc__)

    结果:

            这个函数是描述人的名字
            :param name: 人的名字
            

     __str__

    __str__: __repr__和__str__这两个方法都是用于显示的。打印一个对象时,实际上是调用了这个对象所在类的__str__方法,打印的是这个方法的返回值。

    
    
    class A:
    name="小红"
    def __init__(self):
    pass
    def __str__(self):
    return "中国"
    a=A()
    print(a)
     

    结果

    中国

    __repr__

    __repr__():具体和str__一样,只不多repr更具有兼容性

    __del__

    __del__:析构方法,当对象在内存中被释放时,自动触发执行。这个方法只有在执行del A类的对象的时候才被触发,且先执行代码中的内容,在删除对象。

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

    __new__

    __new__(): 对象的创建,是一个静态方法,第一个参数是cls,cls就是当前的这个类(我已经验证过了),(想想就可以还没有创建对象,怎么会是self),先有创建,才有初始化,即先__new__,再__init__.但__init__其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__ 方法。

    注意:__new__()必须要有返回值,返回创造出来的对象(裸体对象),return后边跟object.__new__(cls),__init__(self) 中的self就是__new__返回的裸体的对象,

    __init__()在__new__()的基础上可以完成一些其它初始化的动作,__init__()不需要返回值。

    若__new__()没有正确返回当前类cls的实例,那__init__()将不会被调用,即使是父类的实例也不行。

    class Foo(object):
        def __init__(self):
            print("我是init")
        def __new__(cls, *args, **kwargs):
            print("cls>>>",cls)
            print("我是__new__")
            name=object.__new__(cls)#继承父类的方法得到一个对象
           # name=super().__new__(cls) # 也可以用这种方法
            return name
    f=Foo()

    结果:

    cls>>> <class '__main__.Foo'> #这里说明cls就是一个类
    我是__new__          #这里说明实例化对象时,先调用__new__再调用__init__
    我是init

    单例模式:参见该博客

     __call__

    __call___: 当你这样写时,对象后边加括号比如f=F()(),其实就是在调用的对象的__call__方法。

    class F:
        def __call__(self, *args, **kwargs):
            print("我是call方法")
    f=F()()

    结果:

    我是call方法

     __name__

    __name__:这个方法参见模块博客。

    如果是类调用的话就是类名

    如果是函数调用的话就是函数名

    如果是在当前文件中执行,if __name__,如果我们单独执行该文件的时候__name__=__main__,如果该文件被导入的时候__name__=文件名

    __dict__

    __dict__: 是用来存储对象和类的属性和方法的一个字典. 当是类调用时里面仅存储的是自己的属性和方法不包括对象的属性,当对象调用时里面存储的是自己的属性(并不包括类属性)

    dir()是一个函数,返回的是list, dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

    class A:
        sex=""
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def f(self):
            print('f')
    
    aa=A('小明',23)
    
    print("对象调用时>>>>",aa.__dict__)
    print("类调用时>>>>",A.__dict__)

    结果:

    对象调用时>>>> {'name': '小明', 'age': 23}
    类调用时>>>> {'__module__': '__main__', 'sex': '', '__init__': <function A.__init__ at 0x000002DE7152E730>, 'f': <function A.f at 0x000002DE7152E7B8>, 
    '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

    __import__

    __import__(字符串):  同import语句同样的功能,但__import__是一个函数,并且只接收字符串作为参数,所以它的作用就可想而知了。其实import语句就是调用这个函数进行导入工作的,import sys <==>sys = __import__('sys')

    我们要导入另外一个模块,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?

    imp=input("请输入您要导入的模块名字:")
    cc=__import__("demo")
    imp_func=input("请输入您要调用的函数")
    f=getattr(cc,imp_func,None)
    print(f)
    if f:
        f()
  • 相关阅读:
    golang --写test测试用例
    Golang ---testing包
    golang --Converting and Checking Types
    python ---升级所有安装过的package
    给定数组和某个值,求和等于某值的序号
    https://leetcode-cn.com/
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    TJ Holowaychuk是怎样学习编程的?
    Idea代码可视化插件
    python3插入数据
  • 原文地址:https://www.cnblogs.com/sticker0726/p/7892159.html
Copyright © 2011-2022 走看看