杨东明 发表于 2021-9-12 10:34:04

请教一下下面类和实例的问题

> class A:
        pass

>>> a = A()
>>> type(A)
<class 'type'>
>>> type(a)
<class '__main__.A'>
>>> a.__class__
<class '__main__.A'>
>>> print (a)
<__main__.A object at 0x0000019D52E475C8>
>>> print (A)
<class '__main__.A'>
>>> id(A)
1775207856088
>>> id(a)
1775212197320

问题:1.请问为啥type(A)是一个type类别?A不是一个类吗?
2.type(a)返回的结果中这个__main__是什么意思?为啥type(a)和type(A)返回的一样?
3.print (a)返回的at 0x0000019D52E475C8是实例a的内存地址吗?为啥id(a)和他不同?

阿奇_o 发表于 2021-9-12 10:34:05

本帖最后由 阿奇_o 于 2021-9-12 16:31 编辑

In : type?
Init signature: type(self, /, *args, **kwargs)
Docstring:
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
Type:         type
Subclasses:   ABCMeta, EnumMeta, _TemplateMetaclass, MetaHasDescriptors, PyCStructType, UnionType, PyCPointerType, PyCArrayType, PyCSimpleType, PyCFuncPtrType, ...

type()用两种用法:
   1. 传入的第一个参数,若为对象,则返回该对象所属的类
   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的类 的一个"实例(对象)"。


嗯。。就这样吧,"话题太高端",多说也口干,哈哈哈 {:10_250:}



大马强 发表于 2021-9-12 11:01:10

1.type 表示的意思就是类,type(int) 它返回的也是 type
2.__main__这个我就不太懂了,我认为有一个默认的函数称为主函数 应该就是这个__mian__,所有的代码都在写在个函数里面
3.是一样的,一个是10进制,一个是16进制

傻眼貓咪 发表于 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) 當然不一樣啊,一個是類,一個是類的對象,想變成一樣,看看下面的代碼,你就明白了
class A:
    pass

a = A()

print(id(a))
print(id(A))
# ------------------------------------
class B:
    pass

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

print(id(b))
print(id(B))2706781845488
2706780070400
2706780067568
2706780067568你會發現 b = B 內存地址一樣了,這是為什麼呢?
請再往下看def C():
    print("Hello")
    return 13

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

print(c)

d() # 可以執行,因為 d() 就是 C()Hello
13
Hello

kogawananari 发表于 2021-9-12 14:26:26

>>> type(type)
<class 'type'>

元类也是类

类当然是类
页: [1]
查看完整版本: 请教一下下面类和实例的问题