Python-FAQ-__name__、__main__

1 需求

参考资料:

Single and Double Underscores in Python Names – Real Python


2 接口


3 示例


4 参考资料

在 Python 中,像 __name__ 这样的双下划线属性(也称为 "dunder" 属性,即 "double underscore" 的缩写)是 Python 的特殊属性或方法,它们为类、对象或模块提供了特殊的行为或元数据。以下是一些常见的类似 __name__ 的特殊属性和方法:

1. 模块级特殊属性

这些属性通常在模块层级使用,提供关于模块的元信息:

  • __name__
    当前模块的名称。如果是主程序,则值为 '__main__';如果是被导入的模块,则为模块名。

    if __name__ == '__main__':
        print("作为主程序运行")
    else:
        print(f"被导入为模块: {__name__}")
    
  • __file__
    当前模块的文件路径(如果是脚本),或编译后的字节码文件路径(如 .pyc 文件)。

    print(f"模块文件路径: {__file__}")
    
  • __doc__
    模块、类或函数的文档字符串(docstring)。

    def add(a, b):
        """返回两个数的和"""
        return a + b
    
    print(add.__doc__)  # 输出: "返回两个数的和"
    
  • __package__
    当前模块所属的包名称(用于包内相对导入)。

    print(f"模块所属包: {__package__}")
    
  • __loader__
    加载当前模块的加载器对象。

    print(f"模块加载器: {__loader__}")
    

2. 类和对象的特殊属性

这些属性用于类和对象的底层行为:

  • __class__
    对象所属的类。

    num = 42
    print(num.__class__)  # 输出: <class 'int'>
    
  • __dict__
    类或对象的属性字典,包含所有可写的属性。

    class Person:
        def __init__(self, name):
            self.name = name
    
    p = Person("Alice")
    print(p.__dict__)  # 输出: {'name': 'Alice'}
    
  • __bases__
    类的基类元组,用于查看继承关系。

    class Animal: pass
    class Dog(Animal): pass
    
    print(Dog.__bases__)  # 输出: (<class '__main__.Animal'>,)
    
  • __mro__
    类的方法解析顺序(Method Resolution Order),用于多重继承时确定方法调用路径。

    class A: pass
    class B(A): pass
    class C(B): pass
    
    print(C.__mro__)  # 输出: (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
    

3. 特殊方法(Magic Methods)

这些双下划线方法用于实现对象的特殊行为,如运算符重载、迭代等:

  • __init__(self, ...)
    对象的初始化方法,在创建对象时自动调用。

    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
  • __str__(self)
    对象的字符串表示,用于 print() 和 str() 函数。

    class Point:
        def __str__(self):
            return f"Point({self.x}, {self.y})"
    
  • __len__(self)
    对象的长度,用于 len() 函数。

    class MyList:
        def __init__(self, data):
            self.data = data
        def __len__(self):
            return len(self.data)
    
  • __getitem__(self, key)
    实现对象的索引访问(如 obj[key])。

    class MyList:
        def __getitem__(self, index):
            return self.data[index]
    
  • __call__(self, ...)
    使对象可以像函数一样被调用。

    class Adder:
        def __call__(self, a, b):
            return a + b
    
    add = Adder()
    print(add(3, 4))  # 输出: 7
    

4. 其他特殊属性

  • __slots__
    限制类实例可以添加的属性,节省内存。

    class Person:
        __slots__ = ['name', 'age']  # 只允许添加 'name' 和 'age' 属性
    
  • __all__
    模块中使用 from module import * 时要导入的对象列表(需显式定义)。

    __all__ = ['func1', 'Class1']  # 只导出 func1 和 Class1
    
  • __version__
    模块或包的版本号(通常由开发者自定义)。

    __version__ = '1.0.0'
    

如何查看对象的所有特殊属性?

使用 dir() 函数可以获取对象的所有属性和方法,包括特殊属性。过滤出双下划线开头和结尾的属性即可:

def get_special_attrs(obj):
    return [attr for attr in dir(obj) if attr.startswith('__') and attr.endswith('__')]

# 查看模块的特殊属性
import sys
print(get_special_attrs(sys))

# 查看类的特殊属性
class MyClass: pass
print(get_special_attrs(MyClass))

# 查看对象的特殊属性
obj = MyClass()
print(get_special_attrs(obj))

注意事项

  1. 不要随意修改特殊属性:这些属性是 Python 的底层机制,修改它们可能导致意外行为。
  2. 按需实现特殊方法:特殊方法(如 __str__)用于增强对象的行为,但需谨慎使用。
  3. 避免与特殊属性重名:自定义属性和方法应避免使用双下划线开头和结尾的名称,以免与 Python 的特殊机制冲突。

通过了解这些特殊属性和方法,可以更深入地理解 Python 的运行机制,并编写出更具 Python 风格的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值