2013-10-14 15 views
9

Tôi có một số mã như thế này cho Django-Tastypie:Làm thế nào để truy cập các thuộc tính meta của một siêu lớp trong Python?

class SpecializedResource(ModelResource): 
    class Meta: 
     authentication = MyCustomAuthentication() 

class TestResource(SpecializedResource): 
    class Meta: 
     # the following style works: 
     authentication = SpecializedResource.authentication 
     # but the following style does not: 
     super(TestResource, meta).authentication 

Tôi muốn biết những gì sẽ là phương pháp đúng truy cập thuộc tính meta của lớp cha mà không cứng mã hóa tên của lớp cha.

+0

Trong đoạn mã bạn đã cung cấp tên của một lớp cha không được mã hóa cứng - 'super()' lấy tên của lớp * hiện tại *. –

+0

Và như bình luận nói, nó không hoạt động: P –

Trả lời

8

Trong ví dụ của bạn có vẻ như bạn đang cố gắng ghi đè lên thuộc tính của siêu của siêu lớp. Tại sao không sử dụng thừa kế meta?

class MyCustomAuthentication(Authentication): 
    pass 

class SpecializedResource(ModelResource): 
    class Meta: 
     authentication = MyCustomAuthentication() 

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     # just inheriting from parent meta 
     pass 
    print Meta.authentication 

Output:

<__main__.MyCustomAuthentication object at 0x6160d10> 

sao cho 's metaTestResource được kế thừa từ meta mẹ (ở đây thuộc tính xác thực).

Cuối cùng trả lời câu hỏi:

Nếu bạn thực sự muốn truy cập vào nó (ví dụ để thêm công cụ để một danh sách phụ huynh và vân vân), bạn có thể sử dụng ví dụ của bạn:

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     authentication = SpecializedResource.Meta.authentication # works (but hardcoding) 

hoặc không có cứng mã hóa lớp siêu:

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     authentication = TestResource.Meta.authentication # works (because of the inheritance) 
+0

Đó chính xác là những gì tôi đang tìm kiếm mà không biết. Cảm ơn bạn! Trên thực tế, không cần khai báo xác thực trong TestResource là cần thiết. Khi siêu thừa kế hoạt động, nó chỉ hoạt động. –

+0

Bạn có thể xác nhận xem điều này có hoạt động trong Python 3.4 không? – Akhorus

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