2009-12-19 27 views
6

Tôi có lớp A và tôi muốn lớp B có cùng khả năng giống nhau. Tôi không thể hoặc không muốn kế thừa từ B, chẳng hạn như làm lớp B (A): vượt qua Tôi vẫn muốn B giống hệt A, nhưng có một i: id (A)! = Id (B) Xem ra, tôi không nói về trường hợp nhưng các lớp được nhân bản.Làm thế nào để bạn sao chép một lớp bằng Python?

+3

Thừa kế là lớp nhân bản. Nói rằng bạn không muốn kế thừa là ngớ ngẩn. –

+2

Thừa kế tốt hơn là đi vào lãnh thổ meta –

+2

Có lẽ anh ta muốn có thể thay đổi bản sao theo những cách mà anh ta không thể làm bằng cách định nghĩa các thuộc tính bổ sung trong một lớp dẫn xuất (chẳng hạn như loại bỏ các thuộc tính khỏi lớp cơ sở không bình thường)? – markets

Trả lời

13

Tôi chắc rằng bất cứ điều gì bạn đang cố gắng làm có thể được giải quyết một cách tốt nhất, nhưng ở đây là cái gì đó mang đến cho bạn một bản sao của lớp với một id mới:

def c(): 
    class Clone(object): 
     pass 

    return Clone 

c1 = c() 
c2 = c() 
print id(c1) 
print id(c2) 

cho:

4303713312 
4303831072 
+1

Đây chính xác là những gì tôi đang tìm kiếm. Các giải pháp là hoàn hảo: đơn giản và cho điểm. Tôi biết có một giải pháp nhưng tôi biết nó phải đơn giản. Đây là lần đầu tiên tôi hỏi một câu hỏi cho SO và tôi ngạc nhiên về phản ứng của nó, so với comp.lanp.python gần như không tồn tại. Cảm ơn rất nhiều! – Francois

+0

mà không có một lớp học hiện tại mặc dù. Có vẻ như bạn thực sự muốn có một "máy phát điện lớp" tạo ra cùng một lớp học mọi lúc. – zzzeek

+0

@Francois: Tại sao bạn nói trong câu hỏi của bạn "Tôi không thể hoặc không muốn thừa hưởng từ B, chẳng hạn như làm lớp B (A): vượt qua" nếu bây giờ bạn chấp nhận giải pháp này? –

-1

Bạn có thể sao chép lớp học thông qua kế thừa. Nếu không, bạn chỉ cần truyền xung quanh một tham chiếu đến chính lớp đó (chứ không phải là một tham chiếu đến một thể hiện của lớp). Tại sao bạn vẫn muốn sao chép lớp học? Đó là lý do tại sao bạn sẽ muốn tạo nhiều trường hợp của lớp, nhưng tôi không thể hiểu tại sao bạn muốn một lớp trùng lặp. Ngoài ra, bạn có thể chỉ cần sao chép và dán bằng tên lớp mới ...

-1
class C(object): 
    pass 

class A(C): 
    pass 

class B(C): 
    pass 
0

có thể tôi đã hiểu nhầm bạn câu hỏi nhưng về gói A trong B thì sao?

class A: 

    def foo(self): 
     print "A.foo" 

class B: 

    def __init__(self): 
     self._i = A() 

    def __getattr__(self, n): 
     return getattr(self._i, n) 
7

Tôi đoán đây không phải là những gì bạn muốn nhưng nó những gì các câu hỏi dường như được yêu cầu ...

class Foo(object): 
    def bar(self): 
     return "BAR!" 

cls = type("Bar", (object,), dict(Foo.__dict__)) 

print cls 

x = cls() 
print x.bar() 
+1

Đây là câu trả lời cho câu hỏi tôi nghĩ anh ấy đang hỏi. Người dùng có thể muốn sao chép sâu Foo .__ dict__, tùy thuộc vào cách sử dụng của họ. Bạn có thể bọc nó trong một chức năng tái sử dụng (nơi bạn muốn vượt qua lớp cũ và tên mới)? – markets

+0

Tôi tự hỏi tại sao tôi luôn sử dụng 'type .__ new __()' ở đây? Lần đầu tiên tôi nhìn thấy nó trong một gói Python cụ thể được viết bởi một guru Python nổi tiếng và ông đã sử dụng '__new __()' vì một lý do nào đó. – zzzeek

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