Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个python对象一个int_Java_Python_Static_Int - Fatal编程技术网

Java 每个python对象一个int

Java 每个python对象一个int,java,python,static,int,Java,Python,Static,Int,可能重复: 我想在Python中创建类似以下Java类的内容: public class MyObject { private static int ID = 0; private final int id; public MyObject() { id = ID++; } } 在这个Java代码中,每个myObject都有id,两个对象不可能有相同的id(它是一个单线程应用程序) 我可以在Python中执行类似操作吗?在Python中,您可以

可能重复:

我想在Python中创建类似以下Java类的内容:

public class MyObject {
    private static int ID = 0;
    private final int id;
    public MyObject() {
        id = ID++;
    }
}
在这个Java代码中,每个
myObject
都有
id
,两个对象不可能有相同的id(它是一个单线程应用程序)


我可以在Python中执行类似操作吗?

在Python中,您可以直接引用class属性:

class MyObject(object):
    ID = 0

    def __init__(self):
       self.id = MyObject.ID = MyObject.ID + 1
演示:


正如我在评论@Martjin Pieters的回答时提到的,内置的可能足以满足您的需求
id(obj)
返回系统中任何对象的id,该id在访问时是唯一的(在某些解释器中,基本上是对象的内存地址)。除非您的对象经常被销毁,但您的id引用即使在销毁后也需要保持有效,
id()
应该可以满足您独特的id需求

从文档:

[id()返回的值]是保证唯一的整数(或长整数) 此对象在其生命周期内保持不变。有两个对象 非重叠生存期可能具有相同的id()值


@Martjin Pieters的想法是正确的,但我建议你还是这样做:

class MyObject(object):
    ID = itertools.count()

    def __init__(self):
       self.id = MyObject.ID.next()

>>> MyObject().id
0
>>> MyObject().id
1
>>> MyObject().id
2
>>> MyObject.ID
count(3)

希望这有帮助

为什么每次访问
id
时它都会改变?上面的代码没有这样做。他只是说每个对象都需要一个uid,而不是说它们必须是顺序的
id()
可能对他同样有效(除非GC对象的id可能被重新应用到新对象的风险很小)。@Whymarrh,这是因为每个
id
都来自不同的对象。每个新对象都分配了一个唯一的ID号。这是有道理的,我误认为创建一个新对象是为了访问一个。请注意,Java代码在递增之前分配ID,而此代码在递增之后分配ID。在Python中,您真的不应该调用变量
ID
,因为这是返回对象标识的内置函数的名称。+1。但可能值得引用文档(“这是一个整数(或长整数),保证在其生命周期内此对象是唯一且恒定的。两个生命周期不重叠的对象可能具有相同的id()值”)或类似的
帮助(id)
text。使整个迭代器对象只增加一个整数有什么好处?这个用例似乎并不复杂到足以证明增加的开销是合理的。如果您意外地点击了
=
而不是
+
,会发生什么?如果在意识到是否要按
n递增之前,先递增多个方法,会发生什么=1
相反,以此类推……“如果您输入错误怎么办”同样适用于任何解决方案。至于另一个假设条件,OP明确说明了他的要求。支持每个假设用例的过度工程化是没有价值的。针对您所面临的问题和您可以预测的增长进行设计,而不是将其用于存储核代码场景。也就是说,除非你认为你应该在家里的厨房里放一个这样的东西:我并不支持“所有可能的用例”。我正在做一个小的改变,这将允许在必要时支持许多其他用例。在这两种情况下,
c.next()
MyClass.\u ID+=1
更干净。我并不是想让它成为我的早餐,作为它功能的扩展——我更想让它更灵活,因为它的功能是任何程序都能理解的
MyClass.\u ID+=1
<代码>MyClass.\u ID=c.next()更神秘,而不是更干净。
class MyObject(object):
    ID = itertools.count()

    def __init__(self):
       self.id = MyObject.ID.next()

>>> MyObject().id
0
>>> MyObject().id
1
>>> MyObject().id
2
>>> MyObject.ID
count(3)