目录
前言
在一些底层代码中,我们经常可以看到__name__/__class__等用法的存在,其实我们能从字面上的意思大概猜到各自的作用,但是具体不知到他们指向的是哪个对象。今天就统一记录一下。
这些模块的功能我并没有去百度,我是直接去拿着python IDE去测试的,其实对于这种很简单的功能的测试,建议大家不要第一想法就是搜索引擎查找用法,而是应该自己尝试去测试一下,然后总结出来。
实战
1、__dict__
__dict__其实是对象的一个属性,python一切皆对象,所以我说的对象当然是包含类的啦 。
我们举一个例子,看一下类的__dict__属性下面有哪些变量
class Student:
type = "person"
class_num = 34
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
return self.age
@classmethod
def get_teacher(self):
return "Brain"
stu = Student("weihua", 18)
print(Student.__dict__)
print("*"*30)
print(stu.__dict__)
输出
{'__module__': '__main__', 'type': 'person', 'class_num': 34, '__init__': <function
Student.__init__ at 0x0000016E50734598>, 'get_age': <function Student.get_age at
0x0000016E519626A8>, 'get_teacher': <classmethod object at 0x0000016E5193B278>, '__dict__':
<attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of
'Student' objects>, '__doc__': None}
******************************
{'name': 'weihua', 'age': 18}
可以看出, 类的静态函数、类函数、普通函数、全局变量、类成员变量以及一些内置的属性都是放在类__dict__里的
而对象只把自己的成员变量放在__dict__中。
继承下的__dict__
class Student:
type = "person"
class_num = 34
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
return self.age
@classmethod
def get_teacher(self):
return "Brain"
class MaleStudent(Student):
city = "北京"
def __init__(self,height, name, age):
self.height = height
super().__init__(name, age)
def male_student_get_height(self):
return self.height
print(Student.__dict__)
print("*"*30)
print(MaleStudent.__dict__)
print("*"*30)
stu = Student("weihua", 18)
male_stu = MaleStudent('170', "lily", 18)
print(stu.__dict__)
print("*"*30)
print(male_stu.__dict__)
输出
{'__module__': '__main__', 'type': 'person', 'class_num': 34, '__init__': <function
Student.__init__ at 0x000001D213584598>, 'get_age': <function Student.get_age at
0x000001D2147D26A8>, 'get_teacher': <classmethod object at 0x000001D2147AB390>, '__dict__':
<attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of
'Student' objects>, '__doc__': None}
******************************
{'__module__': '__main__', 'city': '北京', '__init__': <function MaleStudent.__init__ at
0x000001D2147D27B8>, 'male_student_get_height': <function
MaleStudent.male_student_get_height at 0x000001D2147D2840>, '__doc__': None}
******************************
{'name': 'weihua', 'age': 18}
******************************
{'height': '170', 'name': 'lily', 'age': 18}
可以看处,发生继承后:
父类与子类的__dict__各不影响,他们各自只存有自己类定义时静态函数、类函数、普通函数、全局变量、类成员变量以及一些内置的属性。
而继承下,实例化后的对象的__dict__却不同。子类实例化的对象的__dict__包含了自己的实例变量与父类的实例变量
2、__class__
这个就很简单了,__class__就是返回自己的父类
class Student:
type = "person"
class_num = 34
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
return self.age
@classmethod
def get_teacher(self):
return "Brain"
class MaleStudent(Student):
city = "北京"
def __init__(self,height, name, age):
self.height = height
super().__init__(name, age)
def male_student_get_height(self):
return self.height
print(Student.__class__)
print("*"*30)
print(MaleStudent.__class__)
print("*"*30)
stu = Student("weihua", 18)
male_stu = MaleStudent('170', "lily", 18)
print(stu.__class__)
print("*"*30)
print(male_stu.__class__)
输出
<class 'type'>
******************************
<class 'type'>
******************************
<class '__main__.Student'>
******************************
<class '__main__.MaleStudent'>
3、__name__
这个__name__大家可以自行查询它的原理,我这里只讲一下他经常使用的方式与场景。
我们很熟悉的有个
if __name__ == '__main__':
pass
不用多说。表示当前的py文件如果是自身执行时,__name__即等于“__main__”,就会执行下main的代码;如果当前文件是被导入,则__name__就不是"__main__",当然就不会执行后面的代码。
还有一个场景,经常用到,请看下面的代码:
class Student:
type = "person"
class_num = 34
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
print(self.__class__.__name__) # 注意这里
return self.age
@classmethod
def get_teacher(self):
return "Brain"
print(Student.__class__.__name__) # 注意这里
print("*"*30)
stu = Student("weihua", 18)
print(stu.__class__.__name__) # 注意这里
首先是在类的方法中,我们如果想动态的获取当前类的名称的时候,我们可以使用 self.__class__.__name__。
第二中就是,我们可以直接对类或者对象使用xxx.__class__.__name__ ,首先取到xxx的父类,然后返回他的名字
4、__module__
即输出当前对象所在的文件的名称
class Student:
type = "person"
class_num = 34
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
print(self.__class__.__name__)
return self.age
@classmethod
def get_teacher(self):
return "Brain"
def get_module():
pass
print(get_module.__module__)
print("*"*30)
print(Student.__module__)
print("*"*30)
stu = Student("weihua", 18)
print(stu.__module__)
#输出
__main__
******************************
__main__
******************************
__main__
5、__qualname__
我是参考的官网链接:https://pypi.org/project/qualname/
其实就是返回当前对象的所有父级对象的名称,以 “.” 连接。
看代码比较清晰:
class C:
def f():
pass
class D:
def g():
pass
>>> C.__qualname__
'C'
>>> C.f.__qualname__
'C.f'
>>> C.D.__qualname__
'C.D'
>>> C.D.g.__qualname__
'C.D.g'
但是注意一点:__qualname__在python3.3以后才得到支持。