Python ความสัมพันธ์ระหว่างคลาส และการขึ้นอยู่กับอ็อบเจ็กต์

แก้ไข

ขออภัยสำหรับเรื่องทั่วไปก่อนหน้านี้!

ฉันพยายามที่จะชัดเจนยิ่งขึ้น ฉันกำลังทดสอบรูปภาพ ดังนั้นฉันจึงเขียนวิธีการหลายอย่างที่จะใช้ในการวิเคราะห์รูปภาพ ภาพที่ทดสอบไม่ทั้งหมดจะเหมือนกัน ดังนั้นฉันจึงต้องการวัตถุสำหรับแต่ละภาพ หลายวิธีที่ฉันเขียนไม่ได้ทำงานบนอิมเมจทั้งหมด ตัวอย่างเช่น ฉันมีวิธีการที่ส่งคืนระยะห่างของจุดอาเรย์จากศูนย์กลางของรูปภาพ โดยใช้ค่าคงที่ระยะห่างพิกเซลซึ่งเป็นแอตทริบิวต์ของรูปภาพ ที่นี่ฉันมีตัวอย่าง ฉันอ่านรูปภาพและสร้างรูปภาพวัตถุ และคุณลักษณะบางอย่างซึ่งจะเป็นประโยชน์กับฉัน แต่วัตถุชี้ของฉันซึ่งอยู่ในภาพนั้นจะไม่สามารถเข้าถึงคุณลักษณะเหล่านั้นได้หากพวกมันมีคลาสเป็นของตัวเอง การมีคลาสแบบ point มีประโยชน์ เนื่องจากการวิเคราะห์อื่นๆ ก็ใช้ point และใช้วิธีการเดียวกัน

    class image(object):
    def __init__(self, filepath)
    #creates an instance of the image from filepath
        xscale = self.read_header(xspacing)
        xscale = self.read_header(yspacing) #pixels per mm property of image

    class point(object):
    def __init__(slef, i,j)
    self.i = i # array position in image.
    self.j = j
    self.x = self.i * xscale #real position in mm in image
    self.y = self.i * yscale ##but xscale and y scale are not in scope here.

คำถามคือ... ฉันจะให้คุณลักษณะของวัตถุจุด เช่น ระยะทาง ที่ขึ้นอยู่กับคุณลักษณะของรูปภาพ เช่น xscale และ yscale ได้อย่างไร ในใจของฉัน ฉันต้องการให้อนุญาต image.point.x โดยที่ image.point.x ขึ้นอยู่กับ image.xscale ภาวะแทรกซ้อนเล็กๆ น้อยๆ ซึ่งฉันคิดว่าเราอาจมองข้ามได้ในตอนนี้ก็คือ ไม่ควรปล่อยให้จุดนั้นมีอยู่นอกบริบทของรูปภาพ เพราะมันจะไม่มีความหมายอะไรที่จะมีจุดโดยไม่มีคุณลักษณะของรูปภาพ เช่น มาตราส่วน ฉันหวังว่าจะชัดเจนยิ่งขึ้นและโดยทั่วไปมีประโยชน์มากกว่า ขอบคุณ

คำถามเดิม.

ฉันต้องการให้มีภาพเปิด รูปภาพควรเป็นวัตถุ เนื่องจากมีหลายวิธีที่เกี่ยวข้องกัน... เช่น อ่านข้อมูลส่วนหัวและให้แอตทริบิวต์มากมายแก่วัตถุเช่น title, sizex, sizey...

จากนั้นรูปภาพก็ประกอบด้วยคะแนนอย่างเห็นได้ชัด = ฉันก็เลยคิดว่าฉันมีคลาสคะแนน จากนั้นฉันสามารถกำหนดวัตถุ Point ได้ และวัตถุนั้นอาจมีคุณลักษณะ เช่น ตำแหน่ง (ขึ้นอยู่กับค่าคงที่ของระยะห่างพิกเซลจากส่วนหัวของรูปภาพ) และคลาสนี้จะมีเมธอดของจุดมากมาย เช่น ระยะทาง ค่าการเปลี่ยนแปลง การเคลื่อนที่ สเกล การโพลระหว่างจุดสองจุด.... ฯลฯ

ปัญหาของฉันคือสองเท่า การสร้างวัตถุจุดควรขึ้นอยู่กับการมีอยู่ของวัตถุรูปภาพจริงๆ ฉันไม่รู้ว่า python จัดการกับการสร้างวัตถุตามเงื่อนไขประเภทนี้ได้อย่างไร และประการที่สอง วัตถุจุดจะต้องรับรู้ถึงวัตถุรูปภาพที่เกี่ยวข้อง ตามหลักการแล้ว ฉันจะมี Image.Point(x,y) และนั่นหมายความว่ามีจุด x,y อยู่ภายในรูปภาพ และดังนั้นจึงสามารถเข้าถึงตัวแปรทั้งหมดที่สร้างขึ้นเมื่อวัตถุรูปภาพถูกเตรียมใช้งาน ฉันหวังว่าทุกสิ่งจะสมเหตุสมผล ฉันได้ลอง super แล้ว แต่ดูเหมือนว่าจะไม่ทำบิตแบบมีเงื่อนไข และมันรันเมธอดในคลาสพื้นฐาน โดยที่ฉันแค่อยากมีตัวแปรบางตัวเท่านั้น

ขอบคุณสำหรับความช่วยเหลือใด ๆ


person Andrew    schedule 02.07.2011    source แหล่งที่มา
comment
การสร้างวัตถุจุดควรขึ้นอยู่กับการมีอยู่ของวัตถุรูปภาพจริงๆ ฉันไม่รู้ว่า python จัดการกับการสร้างวัตถุตามเงื่อนไขประเภทนี้ได้อย่างไร ออบเจ็กต์กำลังถูกสร้างขึ้นเมื่อคุณบอกให้ Python ทำเช่นนั้น ไม่มีการสร้างออบเจ็กต์อัตโนมัติหรืออะไรเลย คุณจะต้องให้วัตถุ Image สร้างวัตถุ Point ของตัวเองเมื่อเริ่มต้น คุณแน่ใจหรือว่าต้องการชั้นเรียนแบบจุด? แล้ว: (x, y) เพื่อแสดงจุดล่ะ   -  person phant0m    schedule 02.07.2011
comment
@Andrew - เป็นที่ชัดเจนว่าคุณมีปัญหาที่คุณใช้เวลาคิดมาบ้าง แต่ก็ไม่ชัดเจนเท่ากันว่าคุณกำลังถามอะไร คุณช่วยโพสต์โค้ด (หรือโค้ดหลอก) เพื่อแสดงสิ่งที่คุณถามได้ดีขึ้นหรือไม่ ฉันเห็นว่ามีบางคนโหวตให้ปิดคำถามของคุณ หากสิ่งนี้เกิดขึ้น อย่าลังเลที่จะโพสต์ใหม่พร้อมคำอธิบายปัญหาโดยละเอียดเพิ่มเติม! :)   -  person mac    schedule 02.07.2011
comment
@mac - ขอบคุณ ฉันได้พยายามปรับปรุงคำถามแล้ว   -  person Andrew    schedule 02.07.2011
comment
@ phant0m - ถ้าฉันบอกให้ python สร้างวัตถุ point มันจะขึ้นอยู่กับกฎภายในคลาส point ในความเป็นจริงจุดนั้นมีอยู่ในบริบทของภาพใดภาพหนึ่งเท่านั้น บางทีอาจเป็นตำแหน่งของดวงตาที่กลับมาจากวิธีการจดจำใบหน้า จุดนั้นเกี่ยวข้องกับภาพถ่ายเพียงภาพเดียวเท่านั้น ถ้าฉันไม่มีคลาสคะแนน ฉันอาจจะทำซ้ำวิธีการในคลาสต่างๆ ตัวอย่างเช่น def Distance(point1,point2) มีประโยชน์ในการวิเคราะห์ภาพถ่ายและการวิเคราะห์สไลด์ด้วยกล้องจุลทรรศน์ - แต่ฉันไม่ต้องการอ่านทั้งสองภาพในคลาสเดียวกัน   -  person Andrew    schedule 02.07.2011


คำตอบ (2)


ดังนั้นคุณจึงต้องการให้รูปภาพมีวิธีส่งคืนคะแนนในภาพนั้น (โรงงานจุด) เช่น:

class Image:
    #...
    def point_at(self, x,y):
        return PointInImage(self, ...)
    #...

class PointInImage:
    #...
    def __init__(self, image, ...):
        self.image = image
        #...
    #...
person Dan D.    schedule 02.07.2011
comment
ง ขอบคุณสำหรับสิ่งนี้ การส่งคืนคำสั่งเพื่อสร้างวัตถุของคลาสอื่นดูเหมือนแปลกใหม่สำหรับฉัน นี่คือจุดที่ฉันชี้ให้เห็นว่าเมื่อสองสัปดาห์ที่แล้วฉันไม่เคยเขียนโปรแกรม OO เลย ขอบคุณทุกคน. - person Andrew; 02.07.2011

คุณสามารถทำได้เช่นนี้:

class Point(object):
    def __init__(self, image):
        self._image = image

class Image(object):
    def __init__(self, width, height):
        self._points = [Point(self) for unused in range(width * height)]

ด้วยวิธีนี้ แต่ละจุดจะต้องมีรูปภาพในการเริ่มต้น และแต่ละรูปภาพจะมีรายการจุดที่เกี่ยวข้องกัน โปรดทราบว่า เนื่องจากคุณจะสร้าง Point-อินสแตนซ์จำนวนมาก ซึ่งอาจใช้หน่วยความจำมาก คุณควรพิจารณาใช้ สล็อต สำหรับ Point

person Björn Pollex    schedule 02.07.2011
comment
ขอบคุณ สำหรับแต่ละภาพ อาจมี 8 ถึง 12 จุดที่ฉันสนใจ มันดูโง่สำหรับฉันที่จะเขียนทุกจุดเมื่อมีประโยชน์น้อยครั้ง อย่างไรก็ตาม ฉันจำเป็นต้องใช้วิธีการที่ซับซ้อนพอสมควรในจุดเล็กๆ น้อยๆ เหล่านั้น ดังนั้นจึงสมเหตุสมผลสำหรับฉันที่จะมีคลาสแบบจุด - person Andrew; 02.07.2011