วิธีการขยายคลาสใน python


92

ใน python คุณจะขยายคลาสได้อย่างไร? ตัวอย่างเช่นถ้าฉันมี

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!"

แต่มันไม่ได้ผล ... ฉันคาดว่าถ้าฉันใช้งานได้color_extended.pyเมื่อฉันสร้างวัตถุสีและใช้getcolorฟังก์ชั่นมันจะส่งคืนวัตถุด้วยสตริง "ขยาย!" ในตอนท้าย. นอกจากนี้ควรมี gotton เริ่มต้นจากการนำเข้า

สมมติ python 3.1

ขอบคุณ


2
คุณลองอ่านเอกสารหรือไม่? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

ชั้นเรียนควรมีอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ ("สี" ไม่ใช่ "สี");)
daveoncode

14
@wRAR บางทีในปี 2013 นี่เป็นคำถามที่สมเหตุสมผล แต่ขอบอกตามตรง - ผู้คนหันมาใช้ StackOverflow ก่อนดังนั้นนี่จึงเป็นคำถามที่ดีสำหรับ SO คำถามนี้เป็นคำถามแรกของ Google สำหรับ "python expand class" เอกสารเป็นอันดับสาม
TC Proctor

คำตอบ:


94

ใช้:

import color

class Color(color.Color):
    ...

หากนี่คือ Python 2.x คุณจะต้องได้มาcolor.Colorจากobjectเพื่อทำให้เป็นคลาสรูปแบบใหม่ :

class Color(object):
    ...

สิ่งนี้ไม่จำเป็นใน Python 3.x


31
เป็นที่น่าสังเกตว่าคุณสามารถตั้งชื่อคลาสใหม่ให้เหมือนกับคลาสเก่า: class color(color):กำหนดคลาสใหม่ที่มาแทนที่คลาสเก่า แต่ได้มาจากคลาสใหม่ (ซึ่งน่าจะเป็นสิ่งที่ OP จะพยายามที่จะทำ.)
kindall

17
class extended_color(color):เป็นมาตรฐานที่ไม่ดี - class ExtendedColor(Color):ควรมีไว้สำหรับชั้นเรียน Just a nitpick
TyrantWave

Noob ถามที่นี่ทำไมไม่ใช้__init__?
Mentalist

0

อีกวิธีหนึ่งในการขยาย (หมายถึงโดยเฉพาะเพิ่มวิธีการใหม่ไม่เปลี่ยนคลาสที่มีอยู่) แม้กระทั่งคลาสในตัวคือการใช้ตัวประมวลผลล่วงหน้าที่เพิ่มความสามารถในการขยายออกจาก / เหนือขอบเขตของ Python เองโดยแปลงส่วนขยายเป็น ไวยากรณ์ Python ปกติก่อนที่ Python จะเห็นจริง

ฉันได้ทำสิ่งนี้เพื่อขยายstr()คลาสของ Python 2 เป็นต้น str()เป็นเป้าหมายที่น่าสนใจอย่างยิ่งเพราะการเชื่อมโยงไปยังข้อมูลนัยอ้างเช่นและ'this''that'

นี่คือโค้ดส่วนขยายซึ่งมีเพียงไวยากรณ์ที่ไม่ใช่ Python ที่เพิ่มเข้ามาคือextend:testDottedQuadบิต:

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

หลังจากนั้นฉันสามารถเขียนโค้ดที่ป้อนให้กับตัวประมวลผลล่วงหน้า:

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'

พรีโปรเซสเซอร์กินสิ่งนั้นคาย Python ปกติโดยไม่ต้องจับลิงและ Python ก็ทำตามที่ฉันตั้งใจจะทำ

เช่นเดียวกับที่ตัวประมวลผลล่วงหน้า ac เพิ่มฟังก์ชันให้กับ c ดังนั้นตัวประมวลผลล่วงหน้าของ Python ก็สามารถเพิ่มฟังก์ชันให้กับ Python ได้

การใช้งานตัวประมวลผลล่วงหน้าของฉันมีขนาดใหญ่เกินไปสำหรับคำตอบแบบสแต็กล้น แต่สำหรับผู้ที่อาจสนใจมันอยู่ที่ GitHub

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.