2014-11-04 12 views
5

Bên cạnh những điều hiển nhiên, tôi nghĩ rằng tôi muốn thử loại này, chỉ trong trường hợp:Có cách nào để phân lớp máy phát điện bằng Python 3 không?

def somegen(input=None): 
    ... 
    yield 
    ... 

gentype = type(somegen()) 
class subgen(gentype): 
    def best_function_ever(): 
     ... 

Alas, phản ứng Python là khá thù địch:

"TypeError: Type generator is not an acceptable base type" 

Như may mắn sẽ có nó, đó là một vấn đề cho tôi. Thấy chưa, tôi đã suy nghĩ rằng có lẽ nó sẽ là một loại cơ sở vui chơi với, nếu tôi đưa cho nó một cơ hội. Hãy tưởng tượng sự ngạc nhiên của tôi! ..và mất tinh thần. Có cách nào để có được Python toàn năng để xem mọi thứ theo cách của tôi trên này?

Đây là chắc chắn nhất một bên ngoài-the-box kinda câu hỏi, vì vậy xin đừng chỉ nói rằng nó không thể xảy ra nếu bạn không thể nghĩ ra một cách ngay lập tức. Python (đặc biệt là Py3) rất linh hoạt.

Tất nhiên, nếu bạn có bằng chứng về việc tại sao nó không thể (không phải là "không nên") là một loại cơ sở (Py3), sau đó tôi làm muốn xem và hiểu điều đó.

+0

Một 'trình tạo' là một kiểu' phương thức'. Một 'lớp' chỉ có thể kế thừa từ' lớp' khác. Nó sẽ là tương tự để xây dựng một chiếc xe ra khỏi lái xe. Tôi có thể hiểu được sự thất vọng bởi vì tôi có ý kiến ​​rằng python có thể làm bất cứ điều gì và mọi thứ, nhưng tôi thấy tại sao họ không dành thời gian để thực hiện nó. –

+0

@ FarmerJoe Tôi không chắc chắn rằng tôi có được sự tương tự, nhưng một 'phương pháp' là cơ bản (thậm chí có thể thực sự) một subtype của' function'. Ngoài ra, tất cả mọi thứ là một loại, thậm chí gõ bản thân;) – Inversus

+0

@FarmerJoe Những gì tôi có ý nghĩa bởi đó là, dưới lớp chăn, tất cả mọi thứ là một 'class', thậm chí 'generator'. Một nơi nào đó sâu trong internals, người ta sẽ chắc chắn tìm thấy một số C tương đương của 'phát lớp (chức năng)' và nó rằng lớp mà tôi đang tìm cách để "phân lớp" (ví dụ: tôi hoàn toàn hạnh phúc làm cái gì khác cho phép tôi linh hoạt tương tự) . – Inversus

Trả lời

1

Bạn không thể phân lớp một trình tạo được định nghĩa là hàm sử dụng yield, nhưng bạn có thể sử dụng nó trong một trình tạo khác.

Chỉ cần thực hiện việc này đơn giản:

def alphagen(n=27): 
    if n<0 or n > 27: n = 27 
    for i in range(n): 
     yield chr(ord('A') + i) 

Bạn nhận:

>>>> [ a for a in alphagen(10)] 
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'] 

Bạn có thể sử dụng nó trong:

def alphastartgen(n=27): 
    resul = "" 
    for i in alphagen(n): 
     resul += i 
     yield resul 

Và bây giờ bạn nhận được:

>>> [ a for a in alphastartgen(8) ] 
['A', 'AB', 'ABC', 'ABCD', 'ABCDE', 'ABCDEF', 'ABCDEFG', 'ABCDEFGH'] 
+0

Đó là một góc hấp dẫn .. Tôi sẽ chơi với nó một lúc. Tôi sẽ quay lại. Cảm ơn – Inversus

+0

Tôi trở lại từ chơi với một chút, và tôi phải nói: "Oh ya. Đó là những thứ tốt". Việc xử lý định nghĩa máy phát điện bên ngoài (chức năng) như định nghĩa lớp là chính xác loại tấn công điên mà tôi đã hy vọng. Cảm ơn nhiều. – Inversus

2

Một câu hỏi khác liên quan là Which classes cannot be subclassed?.

Đó là lý do 2 trong câu trả lời được chấp nhận ở đó - lớp con của một loại cần được triển khai trong C và không được triển khai cho máy phát, có thể vì không ai thấy trường hợp sử dụng.

Mã nguồn cho đối tượng trình phát là genobject.c và bạn có thể thấy trên dòng 349 rằng cờ Py_TPFLAGS_BASETYPE không được đặt.

+1

Ooo. Thật tuyệt. Đó có phải là điều duy nhất ngăn cản tôi phân lớp một gen không? Có những phần khác của nội bộ cần được thuyết phục không? Điều này có thể được thực hiện tại thời gian chạy (monkeypatch?) Hoặc tôi có thể cần phải thực hiện một xây dựng tùy chỉnh? (một con đường dài tôi đang cố gắng tránh cho thời điểm này lol) – Inversus

+0

Ngoài ra .. làm thế nào bạn tìm thấy lá cờ đó?Giống như, bạn chỉ biết về nó, hoặc bạn đã theo mã ở đó hay cái gì đó? – Inversus

+0

Tôi đã tìm thấy chuỗi ngăn xếp ngăn xếp trước đó mà tôi đã liên kết và đọc nó ... Và cờ không đủ, bạn cũng phải _implement_ cách nó hoạt động (xem, mã, danh sách) và biên dịch lại Python. – RemcoGerlich

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