Merhaba,
TL adında yeni bir veri tipi tanımlamaya çalıştım;
Fakat, sorun şu ki; TL
'den, int
'e çevirirken ‘₺’ karakteri, sorun çıkarıyor.
Bunu, -sınıf içinde- nasıl ayarlayabilirim?
Kod:
class TL(float):
def __new__(self, *args, **kwargs):
return f"₺ {super().__new__(self, *args, **kwargs)}"
i = 100
print(i)
tl = TL(i)
print(tl)
r_i = int(tl)
print(r_i)
Hata:
100
₺ 100.0
Traceback (most recent call last):
File "<string>", line 11, in <module>
ValueError: invalid literal for int() with base 10: '₺ 100.0'
Not: ₺
= ₺
__new__
, TL
örneği döndürmediği için sınıfın hiçbir anlamı yok. tl
değişkeninin tipi TL
değil, str
. __new__
, bir TL
örneği döndürürse miras alınan float
sınıfı zaten __int__
metodunu sağlar. Örnekleri ekrana yazmak için de __repr__
metodu lazım.
Niye kendi __new__
metodunuzu yazıyorsunuz?
1 Beğeni
EkremDincel:
__new__
, TL
örneği döndürmediği için sınıfın hiçbir anlamı yok. tl
değişkeninin tipi TL
değil, str
. __new__
, bir TL
örneği döndürürse miras alınan float
sınıfı zaten __int__
metodunu sağlar. Örnekleri ekrana yazmak için de __repr__
metodu lazım.
Hmm… bunu basit bir örnek ile biraz açar mısınız?
Aynısını __init__()
ile denedim, ama “__init__()
, sadece None
döndürmeli” gibi bir hata verdiği için __new__()
ile denedim.
Dedikleriniz üzere birkaç deneme yaptım ve sanırım başardım.
Kod:
class TL(float):
def __init__(self, x):
super().__init__()
self.x = x
def __repr__(self):
return f"₺ {self.x}"
i = 100
print(i)
tl = TL(i)
print(tl)
print(type(tl))
r_i = int(tl)
print(r_i)
Çıktı:
100
₺ 100
<class '__main__.TL'>
100
Niye None
dışında bir şey döndürmeye ihtiyacınız var?
Amacınıza ulaşmışsınız ama yöntem pek doğru durmuyor. Eğer girilen sayı (x
) bir nitelik olarak saklanacaksa float
’ı miras almaya gerek yok:
class TL():
def __init__(self, x):
self.x = x
def __int__(self):
return int(self.x)
def __float__(self):
return float(self.x)
def __repr__(self):
return f"₺ {self.x}"
float
miras alınacaksa da x
’e gerek yok:
class TL(float):
def __repr__(self):
return f"₺ {super().__repr__()}"
Bir de şimdi koda bakınca hatırladım: __repr__
daha çok debug amaçlı kullanılıyor, bu örnekte __repr__
'leri __str__
ile değiştirmek daha doğru olur.
Aslında biraz daha uğraşıp, şöyle birşey yapmıştım;
def __init__(self, x=float()):
super().__init__()
self.x = x
def __str__(self):
if not isinstance(self.x, TL):
return f"₺ {self.x}"
else:
return f"{self.x}"
Ama şu kadarı bile işimi gördü:
class TL(float):
def __str__(self):
return f"₺ {super().__repr__()}"
Peki bunu sözdizimine dahil etmenin bir yolu varmı?
Mesela,
>>> x = ₺123.0 #veya TL123.0
>>> type(x)
<class '__main__.TL'>
Samet195:
Aslında biraz daha uğraşıp, şöyle birşey yapmıştım;
def __init__(self, x=float()):
super().__init__()
self.x = x
def __str__(self):
if not isinstance(self.x, TL):
return f"₺ {self.x}"
else:
return f"{self.x}"
Bu kodda da şu geçerli:
__str__
kısmını da anlamadım.
Yok.
1 Beğeni