2011-12-25 36 views
10

Tôi đã dọn dẹp một số mã từ một mô-đun Tôi đang mở rộng và tôi dường như không thể tìm thấy một cách để Pythonify mã này:Đếm các phiên bản của một lớp?

global_next_id = 1 

class Obj: 
    def __init__(self): 
    global global_next_id 
    self.id = global_next_id 

    global_next_id += 1 

Mã này sử dụng một id toàn cầu để theo dõi các trường hợp của một lớp (tôi cần biến số self.id nội bộ là tốt, và nó cần phải là một số).

Có ai có thể đề xuất cách để Python hóa mã này không?

+1

Tại sao bạn cần phải "theo dõi các trường hợp của một lớp" với một id toàn cầu? –

+1

Nó dành cho thư viện PDF mà tôi đang sửa đổi. Mỗi tệp PDF 'Obj' cần được in ra với ID tương ứng của nó. – Blender

Trả lời

34

Hãy thử một cái gì đó như thế này:

from itertools import count 

class Obj(object): 
    _ids = count(0) 

    def __init__(self): 
    self.id = next(self._ids) 
+1

Tôi hoàn toàn bỏ qua các biến toàn lớp ... Cảm ơn vì giải pháp 'itertools'! – Blender

+1

Tôi muốn tôi có thể yêu cầu tín dụng duy nhất - tôi thấy nó ở đâu đó ở đây trên một bài đăng khác. Nó thanh lịch và hiệu quả. –

+0

Eh, nó hoạt động cho tôi. – Blender

1

Generator?

def get_next_id(): 
    curr_id = 1 
    while True: 
     yield curr_id 
     curr_id += 1 
3

Đây là cách tính các trường hợp không có lớp con chia sẻ cùng một id/count. Một metaclass được sử dụng để tạo một bộ đếm id riêng biệt cho mỗi lớp.

Sử dụng cú pháp Python 3 cho Metaclasses.

import itertools 

class InstanceCounterMeta(type): 
    """ Metaclass to make instance counter not share count with descendants 
    """ 
    def __init__(cls, name, bases, attrs): 
     super().__init__(name, bases, attrs) 
     cls._ids = itertools.count(1) 

class InstanceCounter(object, metaclass=InstanceCounterMeta): 
    """ Mixin to add automatic ID generation 
    """ 
    def __init__(self): 
     self.id = next(self.__class__._ids) 
0

này nên thực hiện công việc:

class Obj: 
    _counter = 0 
    def __init__(self): 
     Obj._counter += 1 
     self.id = Obj._counter 
Các vấn đề liên quan