__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
模块来进行更灵活的导入操作。