python的__name__、__class__、__dict__、__module__、__qualname__,以及dir的含义与使用场景

目录

 

前言

实战

1、__dict__

2、__class__

3、__name__

4、__module__

5、__qualname__

 


前言

在一些底层代码中,我们经常可以看到__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以后才得到支持。

 

 

 

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值