__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__ 是Python中的特殊方法之一,用于创建一个新的实例对象。与 __init__ 方法不同,__new__ 方法负责创建实例,并在 __init__ 方法之前被调用。通常情况下,您不需要自己实现 __new__ 方法,
因为默认的 object 类中已经实现了它,并在创建对象时分配内存空间。

 

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

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

通常情况下,您不需要自己实现 __new__ 方法,因为默认的 object 类中已经实现了它,并在创建对象时分配内存空间。

__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__ 不是一个特殊方法,而是Python中的一个内置函数,用于动态导入模块。它的使用通常是在非常特殊的情况下,因为 Python 提供了更安全和推荐的导入模块的方式,如 import 语句和 importlib 模块。

__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()

 

虽然 __import__ 函数允许动态导入模块,但通常不建议使用它,因为它容易引发安全问题和代码可读性问题。更常见的做法是使用 import 语句,例如 import math

或使用 importlib 模块来进行更灵活的导入操作。

 

posted on 2017-11-24 20:00  程序员一学徒  阅读(480)  评论(0编辑  收藏  举报