2009-11-25 30 views
8

Có vẻ như Python có một số hạn chế về các phương thức mẫu.Khắc phục các hạn chế của Python liên quan đến các phương thức ví dụ

  1. Không thể sao chép phương pháp thể hiện.
  2. Không thể chọn phương pháp thể hiện.

Đây là vấn đề đối với tôi, bởi vì tôi làm việc theo hướng đối tượng project, trong đó tôi tham chiếu các phương pháp mẫu và sử dụng cả in sâu và tẩy. Điều tẩy rửa được thực hiện chủ yếu bằng cơ chế đa xử lý.

Điều gì sẽ là cách hay để giải quyết vấn đề này? Tôi đã làm một số cách giải quyết xấu cho vấn đề sao chép, nhưng Tôi đang tìm một giải pháp đẹp hơn cho cả hai vấn đề.

Có ai có bất kỳ đề xuất nào không?

Cập nhật:

trường hợp sử dụng của tôi: Tôi có một hệ thống sự kiện nhỏ. Mỗi sự kiện có một thuộc tính .action trỏ đến một hàm mà nó phải kích hoạt, và đôi khi hàm đó là một phương thức thể hiện của một số đối tượng.

+5

Thông thường, chúng tôi cung cấp mã ở tất cả các địa điểm mà chúng tôi đang làm việc và chỉ di chuyển đại diện của tiểu bang xung quanh. Chuyển giao trạng thái đại diện phổ biến hơn và đơn giản hơn. Có chuyện gì vậy? –

+0

S.Lott, bạn rõ ràng có nhiều kinh nghiệm hơn với vấn đề này, nhưng hãy giải thích nó với tôi theo cách ngớ ngẩn hơn, bạn gợi ý cái gì, nó liên quan như thế nào, "Chuyển trạng thái đại diện" là gì, v.v. –

+0

Bạn đang nói "Tôi muốn chọn phương pháp dụ", nhưng bạn không nói tại sao. Nó sẽ giúp chúng tôi biết bạn đang cố gắng giải quyết vấn đề gì, vì có thể có một cách Pythonic hơn để làm điều đó. Có vẻ như bạn đang suy nghĩ trong Ruby ... –

Trả lời

15

Bạn có thể thực hiện việc này bằng cách sử dụng copy_reg.pickle. Trong Python 2.6:

import copy_reg 
import types 

def reduce_method(m): 
    return (getattr, (m.__self__, m.__func__.__name__)) 

copy_reg.pickle(types.MethodType, reduce_method) 

này không lưu trữ các đang của phương pháp này, chỉ cần tên của nó; nhưng điều đó sẽ hoạt động chính xác trong trường hợp phổ biến.

Điều này làm cho cả công việc tẩy và sao chép!

+0

Ý tưởng hay, tôi nghĩ đó có thể là giải pháp sạch nhất. Bạn có bất kỳ ý tưởng cho các vấn đề khác, sao chép? Ngoài ra, có ai đã thực hiện một giải pháp 'copy_reg' mà tôi có thể sử dụng không? –

+0

Tôi đã chỉnh sửa câu trả lời và thêm một số mã. –

3

REST - Chuyển trạng thái đại diện. Chỉ cần gửi trạng thái, không phải phương thức.

Để chuyển đối tượng X từ A sang B, chúng tôi thực hiện việc này.

  1. Mã hóa trạng thái X trong một số ký hiệu dễ sử dụng, dễ phân tích cú pháp. JSON phổ biến.

  2. A gửi văn bản JSON để B.

  3. B giải mã trạng thái của X dạng JSON ký hiệu, xây dựng lại X.

B phải có các định nghĩa lớp cho lớp X cho điều này làm việc. B phải có tất cả các hàm và các định nghĩa lớp khác mà lớp X phụ thuộc. Tóm lại, cả A và B đều có tất cả các định nghĩa. Chỉ có một đại diện của trạng thái của đối tượng được di chuyển xung quanh.

Xem bất kỳ bài viết nào trên REST.

http://en.wikipedia.org/wiki/Representational_State_Transfer

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

+0

Bạn có thể giải thích cách phương pháp này liên quan đến vấn đề của tôi với hệ thống sự kiện không? –

+4

Đây là câu trả lời "bạn đang làm sai". Quan điểm này là 'pickle' có thể là một chút * quá * thuận tiện trong Python; nó thực sự tốt hơn để trao đổi dữ liệu cũ Plain (trái ngược với đồ thị đối tượng) bởi vì nó kết quả trong các hệ thống đơn giản mà là saner để lý do. Có một cái gì đó trong đó, nhưng nếu nó hữu ích cho bạn ở tất cả, nó sẽ hữu ích trong một cách lâu dài. –

-3

dưa sơ thẩm và sau đó truy cập phương pháp sau unpickling nó. Chọn một phương pháp của một cá thể không có ý nghĩa bởi vì nó dựa vào cá thể. Nếu không, hãy viết nó như một hàm độc lập.

import pickle 

class A: 
    def f(self): 
     print 'hi' 

x = A() 
f = open('tmp', 'w') 
r = pickle.dump(x, f) 
f.close() 
f = open('tmp', 'r') 
pickled_x = pickle.load(f) 
pickled_x.f() 
+1

A() không phải là một phương pháp thể hiện. –

+1

Bạn đã chọn đối tượng, không phải phương thức thể hiện. Hãy thử chọn phương pháp cá thể trực tiếp. –

+0

chọn trường hợp và sau đó truy cập phương thức sau khi giải nén nó. Việc chọn một phương pháp của một cá thể không có ý nghĩa bởi vì nó dựa trên cá thể. Nếu không, hãy viết nó như một hàm độc lập. –

Các vấn đề liên quan