0

オブジェクト ID の作成の自動化について少し読んだことがありますが、まだ迷子になっています...ここでAlgorias による素晴らしい例に基づいて次のコードを作成しようとしました...

私が達成しようとしているのは、すべての新しい id リクエストのリソースであるクラスです。論理的には、すべてが 1 か所にあれば、管理が容易になるはずです...

しかし、 x を Order のインスタンスに設定すると、次のようになります。

>>> 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
4

3 に答える 3

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')
于 2012-07-12T21:33:23.083 に答える
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()
于 2012-07-12T21:34:11.427 に答える
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()
于 2012-07-12T21:34:22.770 に答える