Làm thế nào để mở rộng một lớp trong python?


92

Trong python, làm thế nào bạn có thể mở rộng một lớp? Ví dụ nếu tôi có

color.py

class Color:
    def __init__(self, color):
        self.color = color
    def getcolor(self):
        return self.color

color_extended.py

import Color

class Color:
    def getcolor(self):
        return self.color + " extended!"

Nhưng điều này không hiệu quả ... Tôi hy vọng rằng nếu tôi làm việc trong color_extended.py, thì khi tôi tạo một đối tượng màu và sử dụng getcolorhàm thì nó sẽ trả về đối tượng có chuỗi "mở rộng!" đến cuối cùng. Ngoài ra, nó phải có gotton init từ quá trình nhập.

Giả sử python 3.1

Cảm ơn


2
Bạn đã thử đọc tài liệu chưa? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

các lớp phải viết hoa chữ cái đầu tiên ("Màu" không phải "màu");)
daveoncode

14
@wRAR Có thể vào năm 2013, đây là một câu hỏi hợp lý, nhưng thành thật mà nói - mọi người chuyển sang StackOverflow trước tiên, vì vậy đây là một câu hỏi hay cần có trên SO. Câu hỏi này là lần truy cập đầu tiên của google cho "lớp mở rộng python", tài liệu là thứ ba.
Giám sát viên TC

Câu trả lời:


94

Sử dụng:

import color

class Color(color.Color):
    ...

Nếu đây là Python 2.x, bạn cũng muốn lấy color.Colortừ đó objectđể biến nó thành một lớp kiểu mới :

class Color(object):
    ...

Điều này là không cần thiết trong Python 3.x.


31
Cần lưu ý rằng bạn có thể đặt tên cho lớp mới giống với tên cũ: class color(color):định nghĩa một lớp mới thay thế cho lớp cũ, nhưng có nguồn gốc từ nó. (Đây dường như là những gì OP đang cố gắng làm.)
kindall

17
class extended_color(color):thường là tiêu chuẩn xấu - class ExtendedColor(Color):nên dành cho các lớp học. Just a nitpick
TyrantWave

Câu hỏi Noob ở đây: tại sao bạn không sử dụng __init__?
Mentalist

0

Một cách khác để mở rộng (ý nghĩa cụ thể là thêm các phương thức mới, không thay đổi các phương thức hiện có), thậm chí là các lớp được tích hợp sẵn, là sử dụng một bộ tiền xử lý bổ sung khả năng mở rộng ra ngoài / trên phạm vi của chính Python, chuyển đổi phần mở rộng thành cú pháp Python bình thường trước khi Python thực sự nhìn thấy nó.

str()Ví dụ, tôi đã làm điều này để mở rộng lớp của Python 2 . str()là một mục tiêu đặc biệt thú vị vì mối liên kết ngầm với dữ liệu được trích dẫn chẳng hạn như 'this''that'.

Đây là một số mã mở rộng, trong đó cú pháp không phải Python được bổ sung duy nhất là extend:testDottedQuadbit:

extend:testDottedQuad
def testDottedQuad(strObject):
    if not isinstance(strObject, basestring): return False
    listStrings = strObject.split('.')
    if len(listStrings) != 4: return False
    for strNum in listStrings:
        try:    val = int(strNum)
        except: return False
        if val < 0: return False
        if val > 255: return False
    return True

Sau đó, tôi có thể viết mã được cung cấp cho bộ tiền xử lý:

if '192.168.1.100'.testDottedQuad():
    doSomething()

dq = '216.126.621.5'
if not dq.testDottedQuad():
    throwWarning();

dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
    print 'well, that was fun'

Bộ xử lý tiền xử lý ăn nó, tạo ra Python bình thường mà không cần khớp nối với khỉ và Python thực hiện những gì tôi dự định làm.

Cũng giống như bộ tiền xử lý ac thêm chức năng cho c, thì bộ tiền xử lý Python cũng có thể thêm chức năng vào Python.

Việc triển khai bộ tiền xử lý của tôi quá lớn đối với câu trả lời tràn ngăn xếp, nhưng đối với những người có thể quan tâm, nó có ở đây trên GitHub.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.