鱼C论坛

 找回密码
 立即注册
查看: 1343|回复: 4

[已解决]请教一下下面类和实例的问题

[复制链接]
发表于 2021-9-12 10:34:04 | 显示全部楼层 |阅读模式
10鱼币
  1. > class A:
  2.         pass

  3. >>> a = A()
  4. >>> type(A)
  5. <class 'type'>
  6. >>> type(a)
  7. <class '__main__.A'>
  8. >>> a.__class__
  9. <class '__main__.A'>
  10. >>> print (a)
  11. <__main__.A object at 0x0000019D52E475C8>
  12. >>> print (A)
  13. <class '__main__.A'>
  14. >>> id(A)
  15. 1775207856088
  16. >>> id(a)
  17. 1775212197320
复制代码


问题:1.请问为啥type(A)是一个type类别?A不是一个类吗?
2.type(a)返回的结果中这个__main__是什么意思?为啥type(a)和type(A)返回的一样?
3.print (a)返回的at 0x0000019D52E475C8是实例a的内存地址吗?为啥id(a)和他不同?
最佳答案
2021-9-12 10:34:05
本帖最后由 阿奇_o 于 2021-9-12 16:31 编辑
  1. In [1]: type?
  2. Init signature: type(self, /, *args, **kwargs)
  3. Docstring:
  4. type(object_or_name, bases, dict)
  5. type(object) -> the object's type
  6. type(name, bases, dict) -> a new type
  7. Type:           type
  8. Subclasses:     ABCMeta, EnumMeta, _TemplateMetaclass, MetaHasDescriptors, PyCStructType, UnionType, PyCPointerType, PyCArrayType, PyCSimpleType, PyCFuncPtrType, ...

  9. type()  用两种用法:
  10.      1. 传入的第一个参数,若为对象,则返回该对象所属的类
  11.      2. 传入的第一个参数,若为字符串名称,且第二、三个参数的正确传入,则生成一个新的 以该字符串为名的类
复制代码


嗯,真要展开讲的话,基本可以写一篇小作文了,因为基本上涉及了Python的核心的核心,
比如 变量(名)与对象的关系,  比如 "Python里一切都是对象",连"类"也是,所以你执行 id(A) 也返回一个唯一的"对象地址"。。
所以,type() 返回的是"类",其实也是"对象",从这个角度看,在Python里真正的类,其实只有 type 这"元类"(Metaclass)
参考:https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python

而 __main__ 则 涉及"作用域",
以及Python(动态脚本语言)和Java,C,C++等静态编译语言,之间的不同:
Java等其他语言,都有一个"程序入口"(main函数),  而Python没有统一的"程序入口",
它是从上往下一条条命令执行的——最外层/顶层的代码都会"被解释"(随后被执行),
为了解决"入口的问题" 或者说 为了能够"选择性地执行和调用",就有了 if __name__ == "__main__" 这样的条件判断……

所以呢,
type(A) 或 print(A)  返回 <class '__main__.A'>  就是表示 A 是 该脚本的全局顶层(或交互环境下的顶层)的一个 "类(对象)"。
而 a = A()  ;  print(a) 的返回 <__main__.A object at 0x0000019D52E475C8>  则 代表  a 是 顶层作用域 里一个叫 A的类 的一个"实例(对象)"。


嗯。。就这样吧,"话题太高端",多说也口干,哈哈哈



最佳答案

查看完整内容

嗯,真要展开讲的话,基本可以写一篇小作文了,因为基本上涉及了Python的核心的核心, 比如 变量(名)与对象的关系, 比如 "Python里一切都是对象",连"类"也是,所以你执行 id(A) 也返回一个唯一的"对象地址"。。 所以,type() 返回的是"类",其实也是"对象",从这个角度看,在Python里真正的类,其实只有 type 这"元类"(Metaclass) 参考:https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-12 10:34:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-9-12 16:31 编辑
  1. In [1]: type?
  2. Init signature: type(self, /, *args, **kwargs)
  3. Docstring:
  4. type(object_or_name, bases, dict)
  5. type(object) -> the object's type
  6. type(name, bases, dict) -> a new type
  7. Type:           type
  8. Subclasses:     ABCMeta, EnumMeta, _TemplateMetaclass, MetaHasDescriptors, PyCStructType, UnionType, PyCPointerType, PyCArrayType, PyCSimpleType, PyCFuncPtrType, ...

  9. type()  用两种用法:
  10.      1. 传入的第一个参数,若为对象,则返回该对象所属的类
  11.      2. 传入的第一个参数,若为字符串名称,且第二、三个参数的正确传入,则生成一个新的 以该字符串为名的类
复制代码


嗯,真要展开讲的话,基本可以写一篇小作文了,因为基本上涉及了Python的核心的核心,
比如 变量(名)与对象的关系,  比如 "Python里一切都是对象",连"类"也是,所以你执行 id(A) 也返回一个唯一的"对象地址"。。
所以,type() 返回的是"类",其实也是"对象",从这个角度看,在Python里真正的类,其实只有 type 这"元类"(Metaclass)
参考:https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python

而 __main__ 则 涉及"作用域",
以及Python(动态脚本语言)和Java,C,C++等静态编译语言,之间的不同:
Java等其他语言,都有一个"程序入口"(main函数),  而Python没有统一的"程序入口",
它是从上往下一条条命令执行的——最外层/顶层的代码都会"被解释"(随后被执行),
为了解决"入口的问题" 或者说 为了能够"选择性地执行和调用",就有了 if __name__ == "__main__" 这样的条件判断……

所以呢,
type(A) 或 print(A)  返回 <class '__main__.A'>  就是表示 A 是 该脚本的全局顶层(或交互环境下的顶层)的一个 "类(对象)"。
而 a = A()  ;  print(a) 的返回 <__main__.A object at 0x0000019D52E475C8>  则 代表  a 是 顶层作用域 里一个叫 A的类 的一个"实例(对象)"。


嗯。。就这样吧,"话题太高端",多说也口干,哈哈哈



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

使用道具 举报

发表于 2021-9-12 11:01:10 | 显示全部楼层
1.type 表示的意思就是类,type(int) 它返回的也是 type
2.__main__这个我就不太懂了,我认为有一个默认的函数称为主函数 应该就是这个__mian__,所有的代码都在写在个函数里面
3.是一样的,一个是10进制,一个是16进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-12 11:49:58 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-9-12 16:58 编辑


1. type 就是類啊
2. type(a) 和 type(A) 返回不一樣啊,
type(A) 返回<class 'type'>
type(a) 返回<class '__main__.A'>
因為你讓 a 指向 A() 對象了啊(第 4 行, a = A()),__main__ 就是文本中的默認值(__main__.A 表示 A類的默認值),如想更深入了解 __main__ 建議參考__name__ == "__main__"
3. id(a) 和 id(A) 當然不一樣啊,一個是類,一個是類的對象,想變成一樣,看看下面的代碼,你就明白了
  1. class A:
  2.     pass

  3. a = A()

  4. print(id(a))
  5. print(id(A))
  6. # ------------------------------------
  7. class B:
  8.     pass

  9. b = B # 這裡 B 沒有括號()

  10. print(id(b))
  11. print(id(B))
复制代码
  1. 2706781845488
  2. 2706780070400
  3. 2706780067568
  4. 2706780067568
复制代码
你會發現 b = B 內存地址一樣了,這是為什麼呢?
請再往下看
  1. def C():
  2.     print("Hello")
  3.     return 13

  4. c = C() # 這裡會執行 C() 函數,並把返回值賦予給 c
  5. d = C # 這裡不會執行 C() 函數,讓 d 變成 C 同樣函數(簡單的說就是指向同一對象)

  6. print(c)

  7. d() # 可以執行,因為 d() 就是 C()
复制代码
  1. Hello
  2. 13
  3. Hello
复制代码

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

使用道具 举报

发表于 2021-9-12 14:26:26 | 显示全部楼层
>>> type(type)
<class 'type'>

元类也是类

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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