鱼C论坛

 找回密码
 立即注册
查看: 1151|回复: 5

[已解决].__name__

[复制链接]
发表于 2023-7-30 16:55:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请教各位大佬,红色的框框起来的.__name__是干嘛的,加上这个和不加上这个程序有啥区别,我感觉不加这东西,也可以打印出类型
最佳答案
2023-7-30 17:02:30
本帖最后由 tommyyu 于 2023-7-30 17:09 编辑

加不加 __name__ 的效果是不一样的。演示如下:
  1. >>> type('1')
  2. <class 'str'>
  3. >>> type('1').__name__
  4. 'str'
  5. >>> print(type('1'))
  6. <class 'str'>
  7. >>> print(type('1').__name__)
  8. str
复制代码

__name__ 在作为类的属性被访问时会返回这个类的名称。演示如下:
  1. >>> str.__name__
  2. 'str'
  3. >>> int.__name__
  4. 'int'
复制代码
实际上,type 函数返回的值是该对象所处的类。演示如下:
  1. >>> type(1) == int
  2. True
  3. >>> type('1') == str
  4. True
复制代码

综合以上信息,我们发现,type(answer) 可以获取 answer 对象所在的类(比如 int、str等)。需要注意的是,此时获取的仅仅是这个类,而不是字符串('int'、'str')。type(answer).__name__ 中的 .__name__ 获取了这个类的名称,即获取了 ('str'、'int' 等字符串)。最后,print 函数将这个结果打印出来。
7.30-3.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-30 16:55:56 | 显示全部楼层
.__name__ 是 Python 类的特殊属性之一,用于获取类的名称作为字符串。它通常用于调试和日志记录中。

当你在打印一个类时,不加上 .__name__ 的话,会输出类的内存地址或其他默认值,而不是类的名称。例如,如果有一个类定义如下:

  1. class MyClass:
  2.     pass
复制代码


当你直接打印这个类时,不加上 .__name__,会得到类似 <__main__.MyClass object at 0x00000123> 的输出。但是,如果你使用 print(MyClass.__name__),则只会打印出 "MyClass"

总结起来,. __name__ 允许你获取类的名称作为字符串,在某些情况下,比如调试和输出信息时,这将更加方便和易读。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 16:55:57 | 显示全部楼层
.__name__是一个Python中的特殊属性,它用于获取对象的名字或者获取函数的名字。

对于模块(module)来说,.__name__表示模块的名字。当一个模块被直接执行时,其.__name__属性会被设置为'__main__',这意味着可以通过检查该属性来判断模块是否在主程序中执行。例如,考虑以下示例代码:

  1. # my_module.py
  2. def func():
  3.     print("Hello from func!")

  4. print(__name__)
复制代码


如果我们直接运行my_module.py文件,输出将会是:

  1. __main__
复制代码


而如果在另一个文件中导入my_module.py,那么输出将是:

  1. my_module
复制代码


对于函数(function)来说,.__name__表示函数的名字。考虑以下示例代码:

  1. def my_function():
  2.     print("Hello from my_function!")

  3. print(my_function.__name__)
复制代码


输出将会是:

  1. my_function
复制代码


那么加上或者不加上.__name__在程序中有什么区别呢?

通常情况下,我们在编写模块时使用.__name__的主要目的是允许模块在被导入时不执行某些特定代码块,因为直接执行模块的时候,其.__name__属性为'__main__',而当被导入时,.__name__属性为模块的名字。例如:

  1. # my_module.py
  2. def func():
  3.     print("Hello from func!")

  4. if __name__ == "__main__":
  5.     print("This is the main block.")
复制代码


在这个例子中,如果直接运行my_module.py,会输出"This is the main block.",但如果在另一个文件中导入my_module.py,就不会执行if条件下的代码块。

对于函数的.__name__属性,通常用于调试或者记录日志时,可以在输出信息中显示函数的名字。例如:

  1. def log_function_call(func):
  2.     def wrapper(*args, **kwargs):
  3.         print(f"Calling function {func.__name__}")
  4.         result = func(*args, **kwargs)
  5.         print(f"Function {func.__name__} execution complete")
  6.         return result
  7.     return wrapper

  8. @log_function_call
  9. def my_function():
  10.     print("Hello from my_function!")

  11. my_function()
复制代码


输出将会是:

  1. Calling function my_function
  2. Hello from my_function!
  3. Function my_function execution complete
复制代码


因此,加上.__name__属性在一些特定的情况下可以让代码更加灵活和可控,但对于一般的类型打印并没有区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 16:56:16 | 显示全部楼层
问题解答:

在 Python 中,.__name__ 是一个对象的属性,用于获取该对象的名称。这个属性通常用于获取函数、类或模块的名称。

下面是一些示例代码来说明 .__name__ 的作用和使用情况:
  1. # 示例 1:获取函数的名称
  2. def greet():
  3.     print("Hello, world!")
  4. print(greet.__name__)  # 输出: greet
  5. # 示例 2:获取类的名称
  6. class MyClass:
  7.     pass
  8. obj = MyClass()
  9. print(obj.__class__.__name__)  # 输出: MyClass
  10. # 示例 3:获取模块的名称
  11. import math
  12. print(math.__name__)  # 输出: math
复制代码

在上述示例中,.__name__ 被用于获取函数、类和模块的名称。

对于函数对象,. __name__ 属性返回函数的名称。在示例 1 中,函数 greet 的名称是 "greet"。

对于类对象(类的实例化对象),. __class__ 属性返回该对象所属的类,然后可以通过 . __name__ 获取类的名称。在示例 2 中,objMyClass 类的一个实例化对象,因此 obj.__class__.__name__ 返回的是 "MyClass"。

对于模块对象,. __name__ 属性返回模块的名称。在示例 3 中,math 模块的名称就是 "math"。

对于其他对象,. __name__ 可能没有定义,或者返回其他特定值。

在一些情况下,. __name__ 属性可能对于调试和日志记录非常有用。例如,当你编写装饰器时,可以使用 . __name__ 获取被装饰函数的名称,并在日志中记录它。

如果你不使用 . __name__ 属性,可能无法直接获取对象的名称。但是,这并不表示不能打印出对象的类型。你可以使用其他属性或函数来确定对象的类型,比如 type() 函数。

希望这能解答你的问题!如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 17:02:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 tommyyu 于 2023-7-30 17:09 编辑

加不加 __name__ 的效果是不一样的。演示如下:
  1. >>> type('1')
  2. <class 'str'>
  3. >>> type('1').__name__
  4. 'str'
  5. >>> print(type('1'))
  6. <class 'str'>
  7. >>> print(type('1').__name__)
  8. str
复制代码

__name__ 在作为类的属性被访问时会返回这个类的名称。演示如下:
  1. >>> str.__name__
  2. 'str'
  3. >>> int.__name__
  4. 'int'
复制代码
实际上,type 函数返回的值是该对象所处的类。演示如下:
  1. >>> type(1) == int
  2. True
  3. >>> type('1') == str
  4. True
复制代码

综合以上信息,我们发现,type(answer) 可以获取 answer 对象所在的类(比如 int、str等)。需要注意的是,此时获取的仅仅是这个类,而不是字符串('int'、'str')。type(answer).__name__ 中的 .__name__ 获取了这个类的名称,即获取了 ('str'、'int' 等字符串)。最后,print 函数将这个结果打印出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-30 17:40:50 | 显示全部楼层
tommyyu 发表于 2023-7-30 17:02
加不加 __name__ 的效果是不一样的。演示如下:
__name__ 在作为类的属性被访问时会返回这个类的名称。演 ...

大概明白了,谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-14 07:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表