- 主题:python object没有“自己的名字”?
下面这段win32获得当前鼠标类型的代码,self.type是个数字,我想要的是对象的名字(比如ARROW、HAND)怎么做?只能在init里加个参数,挨个写后面?
比如,get_current_cursor().type 返回的是 32641,我想要返回字串ARROW
https://stackoverflow.com/questions/1690400/getting-an-instance-name-inside-class-init
这里有个查栈的方法,太丑陋了
from win32con import IDC_APPSTARTING, IDC_ARROW, IDC_CROSS, IDC_HAND, \
IDC_HELP, IDC_IBEAM, IDC_ICON, IDC_NO, IDC_SIZE, IDC_SIZEALL, \
IDC_SIZENESW, IDC_SIZENS, IDC_SIZENWSE, IDC_SIZEWE, IDC_UPARROW, IDC_WAIT
from win32gui import LoadCursor, GetCursorInfo
def get_current_cursor():
curr_cursor_handle = GetCursorInfo()[1]
return Cursor.from_handle(curr_cursor_handle)
class Cursor(object):
@classmethod
def from_handle(cls, handle):
for cursor in DEFAULT_CURSORS:
if cursor.handle == handle:
return cursor
return cls(handle=handle)
def __init__(self, cursor_type=None, handle=None):
if handle is None:
handle = LoadCursor(0, cursor_type)
self.type = cursor_type
self.handle = handle
DEFAULT_CURSORS \
= APPSTARTING, ARROW, CROSS, HAND, HELP, IBEAM, ICON, NO, SIZE, SIZEALL, \
SIZENESW, SIZENS, SIZENWSE, SIZEWE, UPARROW, WAIT \
= Cursor(IDC_APPSTARTING), Cursor(IDC_ARROW), Cursor(IDC_CROSS), \
Cursor(IDC_HAND), Cursor(IDC_HELP), Cursor(IDC_IBEAM), Cursor(IDC_ICON), \
Cursor(IDC_NO), Cursor(IDC_SIZE), Cursor(IDC_SIZEALL), \
Cursor(IDC_SIZENESW), Cursor(IDC_SIZENS), Cursor(IDC_SIZENWSE), \
Cursor(IDC_SIZEWE), Cursor(IDC_UPARROW), Cursor(IDC_WAIT)
--
修改:vale FROM 218.241.217.*
FROM 218.241.217.*
id是个长整数啊,我要的是这个变量的名字
【 在 xiaoju 的大作中提到: 】
: 不就是id()?
:
--
FROM 218.241.217.*
所以python object本身是没有名字的,只有个内部的id
好吧,真麻烦
【 在 xiaoju 的大作中提到: 】
: object可以被多个变量指向,除了type就是id有意义
:
--
FROM 218.241.217.*
TclOO了解一下,非常好用
【 在 xiaoju 的大作中提到: 】
: 其他语言的object也一样
:
--
FROM 218.241.217.*
DEFAULT_CURSORS \
= APPSTARTING, ARROW, CROSS, HAND, HELP, IBEAM, ICON, NO, SIZE, SIZEALL, \
SIZENESW, SIZENS, SIZENWSE, SIZEWE, UPARROW, WAIT \
= Cursor(IDC_APPSTARTING), Cursor(IDC_ARROW), Cursor(IDC_CROSS), \
Cursor(IDC_HAND), Cursor(IDC_HELP), Cursor(IDC_IBEAM), Cursor(IDC_ICON), \
Cursor(IDC_NO), Cursor(IDC_SIZE), Cursor(IDC_SIZEALL), \
Cursor(IDC_SIZENESW),
我想要返回的是APPSTARTING, ARROW这些名字,这些实际上是指向对象的变量名
但是变量名没法返回,列出来其实也没有
这段代码写得让我开始以为可以直接取到这些名字
【 在 JulyClyde 的大作中提到: 】
: 而且你其实问的是type的名字吧?
:
--
FROM 101.229.0.*
没看我在吐槽么,这个不是我写的
【 在 omni 的大作中提到: 】
: 你这编程想法就不对。
:
--
FROM 101.229.0.*
给你这种见识短的演示一下什么叫做对象的名字
#!/usr/bin/tclsh
proc GetCursorInfo {} {return 1234}
proc LoadCursor args {return 1234}
oo::class create cursor {
variable handle
constructor h { set handle $h }
method handle {} { return $handle }
self {
method get_current_cursor {} {
foreach c [info class instances [self]] {
if {[$c handle] eq [GetCursorInfo]} { return $c }
}
}
}
}
lmap c {APPSTARTING ARROW CROSS HAND HELP IBEAM ICON NO SIZE SIZEALL
SIZENESW SIZENS SIZENWSE SIZEWE UPARROW WAIT } {
cursor create $c [LoadCursor 0 IDC_$c]
}
puts [cursor get_current_cursor]
【 在 hillg 的大作中提到: 】
: 他说的应该就是你的想法,不是你贴的代码。
: 目测接触不超过两种编程语言,代码行数不超过5000行。
: 请列出保留名字信息的程序语言。
--
FROM 218.241.217.*
我前面就回复过TclOO,你自己不熟就不熟,还来质疑我,以为所有语言都没有对象名字。
我这段代码是完全仿照前面python代码的程序逻辑和功能,就是来演示对象名字是什么。
不懂没关系,说话客气点
【 在 hillg 的大作中提到: 】
: 让你列出语言,你就直接列出语言好了。
: tcl我不熟,如果要举例,那很好,但是如果一个对象的名字需要这么长的代码举例,那我不知道是tcl的问题还是你的问题。
:
: ...................
--
FROM 218.241.217.*
我虽然对python不熟,但这些还都懂。
核心问题是python的对象就是对象,用指向对象的变量来访问。而变量也没有所谓“名字”,至少是没法直接获得。
所以这段python程序中间定义的一堆变量名完全没有用,返回type数字的话完全不需要显式的声明这些变量。所以我最初看的时候被误导了。
但并不是所有语言都这样。tcl里对象有名字,这个名字就是可以用来访问method的命令,不需要用一个变量去指向对象。
【 在 adoal 的大作中提到: 】
: APPSTARTING = Cursor(IDC_APPSTARTING)
: 这里是用IDC_xxxx这个数字作为参数来初始化一个Cursor对象,
: 创建好后才让变量APPSTARTING指向它。
: ...................
--
FROM 218.241.217.*
看清楚再喷,我说的是对象的名字,不是变量的名字
【 在 eggcar 的大作中提到: 】
: 你这一大串代码实在看不下去,你就说你要的是不是reflection吧
: 一个动态到python这种程度的语言连reflection都没有那怎么可能
: 你要只是想让每个对象里面有个字符串唯一代表这个对象的名字,写个装饰器不得了...python基本全都是引用类型,鬼知道你一个对象被多少个变量名给引用了,你要它返回哪个名字才对?
: ...................
--
FROM 101.229.0.*