2016-03-31 11 views
0

Yani C# Point ve Size ile benzer bir Area sınıfları ve Point ve Area sınıfları istiyorum. Gördüğünüz gibi diğer width, height sahipken biri x, y sahiptir dışında iki sınıfları, aynısı olanAlan ve Nokta için ortak bir temel sınıf nasıl uygulamalıyım ve ne aramalıyım?

class Point: 
    def __init__(self, x=0, y=0): 
     self.x = x 
     self.y = y 

    def __add__(self, other): 
     return Point(self.x + other.x, self.y + other.y) 

    # Many other magic methods too! 


class Area: 
    def __init__(self, width=0, height=0): 
     self.width = width 
     self.height = height 

    def __add__(self, other): 
     return Area(self.width + other.width, self.height + other.height) 

    # Many other magic methods too! 

: Burada iki sınıfın basit uygulamalar vardır.

Bu ikisi için bir çeşit temel sınıfın uygulanması için iyi bir çözüm ne olurdu? Eğer değişmez nesneleri kullanarak sakıncası yoksa

+0

@Lucian Muhtemelen "Gördüğünüz gibi, iki sınıfları aynısı diğer' genişlik, height' sahipken biri 'x, y' sahiptir dışında olan" * çünkü * Bir üs sınıf, birden fazla sınıfta yinelenen koddan kurtulur. En iyi çözüm olduğunu söylemiyorum ama bu ** bir ** çözüm. –

+1

Her birinin yapısında iki parametre olması gerekir, ancak bunların mutlaka ortak bir üst sınıfı doğrulamak için yeterli olmasını sağlamaz. – TigerhawkT3

+0

@ TigerhawkT3 Her ikisi de aynı şeyi yapan ortak 10 metodu var ... İki özellik için sadece farklı isim ... –

cevap

1

, iki boyutlu şeyler her için bir temel sınıf oluşturmaya yönelik tuple alt sınıf olabilir: Eğer _2dTuple alt sınıf Şimdi ne zaman

class _2dTuple(tuple): 

    def __new__(cls, hor=0, ver=0): 
     super().__new__(cls, (hor, ver)) 

    def __add__(self, other): 
     return type(self)(self[0] + other[0], self[1] + other[1]) 

, sadece property oluşturabilir senin x, y ve width, height için getters:

class Point(_2dTuple): 

    @property 
    def x(self): 
     return self[0] 

    @property 
    def y(self): 
     return self[1] 


class Area(_2dTuple): 

    @property 
    def width(self): 
     return self[0] 

    @property 
    def height(self): 
     return self[1] 
+0

Ben bir matematikçi değilim, ama "iki boyutlu şeyler" noktaları mıyım? Herhangi bir boyutsal yapıda var olabilirler, fakat kendi başına bir "boyutu" yoktur. Ayrıca, çözümünüz her iki nesneyi de bir ana sınıfa verir, ancak bunu daha az açık olanlarla (ör. "Self [0]") net iç değişkenleri (örn. "Self.width") hızlandırma maliyetinde yapar. Eğer standart üç (uzunluk, genişlik, yükseklik) ötesinde boyutlar için isimlerimiz olmadığından, bunu n boyutlu nesnelere genişletirseniz, mantıklı olur. Fakat 2D nesneler için normal adlandırma kurallarının tercih edilebilir olduğunu düşünüyorum. . – TigerhawkT3

+0

Cevabınız için teşekkür ederiz, birisi daha iyi bir şey bulursa, kabul etmeden önce daha fazla cevap bekleyeceğim! :) –

+0

@ TigerhawkT3 Haklısınız, birinin "şeyleri" nasıl tanımladığına bağlı, benden oldukça belirsiz bir ifadeydi. Belli ki 'width' ve 'height' gibi isimler, indeks üzerinden değişkenlere erişmekten daha iyidir, fakat '2dTuple' adlı alt sınıflar tuple adlı bir sınıfta olduğumuz için, '0' indeksleri aracılığıyla özniteliklere erişmeyi düşünmüyorum ve '1', birinin yazılması için güzel olmasa bile, anlamak için çok karmaşıktır. OP'nin sorusu değerlerin isimlere bağlanmaması etrafında dönüyor çünkü farklı sınıflardaki özellikler için farklı isimler istiyor. –

İlgili konular