2012-07-12 56 views
0

我已经读了一些关于自动化对象id的创建,但仍然迷路了......我试图将以下代码以Algorias here ......创建一个类来生成ID

我想要实现的是一个类,它是所有新的id请求的资源。其中的逻辑是,如果是在同一个地方,应该更容易管理...

但是当我到X设置为订单的一个实例,我得到如下:

>>> x = Order() 

Traceback (most recent call last): 
    File "<pyshell#20>", line 1, in <module> 
    x = Order() 
    File "C:\Python27\delete.py", line 17, in __init__ 
    self.uid = Id_Class.new_id("Order") 
TypeError: unbound method new_id() must be called with Id_Class instance as first argument (got str instance instead) 

任何帮助将不胜感激

import itertools 

class Id_Class(object):  
    new_id = itertools.count(1000).next 
    order_id = itertools.count(1000).next 
    person_id= itertools.count(1000).next 
    def new_id(self, t): # t = type of id required 
     if t == "Order": 
      self.id = Id_Class.order_id() 
     elif t == "Person": 
      self.id = Id_Class.person_id() 

class Order(object): 
    def __init__(self): 
     self.uid = Id_Class.new_id("Order") 
     self.cus='Test' 

class Person(object): 
    pass 

回答

0

您需要在函数声明上使用@staticmethod装饰器。

class Id_Class(object):  
    new_id = itertools.count(1000).next 
    order_id = itertools.count(1000).next 
    person_id= itertools.count(1000).next 

    @staticmethod 
    def new_id(t): # t = type of id required 
     if t == "Order": 
      return Id_Class.order_id() 
     elif t == "Person": 
      return Id_Class.person_id() 
+0

它仍然返回'None'(这显然不是有意的),并且它只用1个参数调用,所以会引发异常,因为它被调用的参数数量错误。 – mgilson 2012-07-12 21:38:07

+0

如果您使用的是Eric的代码,请不要将id分配给self,而是直接将其分配给Order的uid。 – Marconi 2012-07-12 21:40:29

+0

@Marconi - 也摆脱'self'参数... – mgilson 2012-07-12 21:43:44

0

这可能是一个类的方法。类方法接收类作为第一个参数(不像常规方法那样是类的实例)。这样做,您还需要返回值,以便调用者可以访问ie。

class Id_Class(object):  
    new_id = itertools.count(1000).next 
    order_id = itertools.count(1000).next 
    person_id= itertools.count(1000).next 

    @classmethod 
    def new_id(cls, t): # t = type of id required 
     if t == "Order": 
      return cls.order_id() 
     elif t == "Person": 
      return cls.person_id() 
     else: 
      raise ValueError("Must be 'Order' or 'Person'") 

尽管你真的不需要一个类在这里都:

new_id = itertools.count(1000).next 
order_id = itertools.count(1000).next 
person_id= itertools.count(1000).next 
def new_id(t): # t = type of id required 
    if t == "Order": 
     return order_id() 
    elif t == "Person": 
     return person_id() 

然后可以通过简单地称为:

my_order_id=new_id('Order') 
my_person_id=new_id('Person') 
+0

所以我不需要调用它:Id_Class.new_id('Order')?哈,只是试了一下,并回答了我自己的问题:) – AtomicCrash 2012-07-12 22:12:48

+0

@ user1386172使用该类的好处是,它使您的名称空间稍微更清晰 - 但您可以将变量名称order_id更改为_order_id,够好。 – mgilson 2012-07-12 22:20:21

0

因为你调用NEW_ID像静态方法,请尝试添加@staticmethod来代替:

class Id_Class(object):  
    new_id = itertools.count(1000).next 
    order_id = itertools.count(1000).next 
    person_id= itertools.count(1000).next 

    @classmethod 
    def new_id(cls, t): # t = type of id required 
     if t == "Order": 
      return Id_Class.order_id() 
     elif t == "Person": 
      return Id_Class.person_id() 
+0

如果你不打算使用'cls',为什么使它成为classmethod?不妨将它作为一种静态方法并摆脱'cls'参数。 – mgilson 2012-07-12 21:42:33