2016-03-11 15 views
6

Python 3.4'te, float alt sınıfını oluşturmak istiyorum; bu, float gibi matematik ve boolean işlemlerinde kullanılabilen, ancak başka özel işlevlere sahip olan ve bu işlevselliği denetleyen başlatma sırasında bir argüman alabilir. (Özellikle, özel bir __str__ ve bu yöntemde kullanılan bir parametre olmasını istedik.)Python: Floatın bir alt sınıfı yapıcısında ekstra argümanlar alabilir mi?

Ancak, fonksiyonel iki argüman yapıcı olması float bir alt sınıfını almak gibi olamaz. Niye ya? Bu, yerleşik türlerin genişletilmesiyle ilgili bir sınırlama mıdır?

Örnek: Şimdi

class Foo(float): 
    def __init__(self, value, extra): 
     super().__init__(value) 
     self.extra = extra 

Ben Foo(1,2) çalışırsanız alıyorum: Ben Foo(1) yaparsam olsun

TypeError: float() takes at most 1 argument (2 given) 

Hayret, benim yeni __init__ 'ın argümanları da uygulanır:

TypeError: __init__() missing 1 required positional argument: 'extra' 

Buradaki anlaşma nedir? Ben list alt tipleriyle benzer şeyler yaptım ve float üzerinde çalışmadı şaşırdı.

+3

İlgili: http://stackoverflow.com/questions/1936457/sub-classing-float-type-in- piton-başarısız-to-catch-in-init istisna- –

+2

değil sorunuzun cevabını ancak soruna bir çözüm: http://ideone.com/nIPim9 –

+0

ilginç, Robᵩ @. İstediğimi yapmanın yolu olabilir '__new__' gibi görünüyor ama tam olarak bu işi nasıl yapacağınızdan emin değilim. –

cevap

7

Şamandıra değişken olduğu için __new__'un üzerine yazmanız gerekir. Aşağıdaki istediğini yapmalıdır:

class Foo(float): 
    def __new__(self, value, extra): 
     return float.__new__(self, value) 
    def __init__(self, value, extra): 
     float.__init__(value) 
     self.extra = extra 

foo = Foo(1,2) 
print(str(foo)) 
1.0 
print(str(foo.extra)) 
2 

gör de Sub-classing float type in Python, fails to catch exception in __init__()

+0

Evet, bu bir çalışma yaklaşımı - teşekkürler! Yine de neden gerekli olduğuna şaşkınım. '__init__' yönteminiz için' '' '' '' foat'' bir 'Foo' değil, değil mi? Çünkü float .__ new__' ile yarattık? –

+0

Aslında, http://stackoverflow.com/a/13534717/204131, float .__ new__'nın 'Foo 'parametresinden geçtiğine dikkat çeker, bu yüzden floattan ziyade Foo'nun bir örneğini oluşturmalıdır. –

3

cgogolin çözümü haklı. o int gibi başka değişmez sınıflar ile öylesine gibi, str ... Ama yazacak:

class Foo(float): 
    def __new__(cls, value, extra): 
     return super().__new__(cls, value) 
    def __init__(self, value, extra): 
     float.__init__(value) 
     self.extra = extra 
+0

cgogolin nerede? –

+0

onun cevabı yukarıda – qvpham

İlgili konular