Making The Class Nicer

Siz o'z `class`ingizning bir instance'ini chop etganingizda qanday ko'rinishda bo'lganini eslaysizmi?

SU

Klassni Yaxshilash

Siz o'z classingizning bir instance'ini chop etganingizda qanday ko'rinishda bo'lganini eslaysizmi? Agar eslamasangiz, natija quyidagicha ko'rinadi:

<__main__.Ball object at 0x101f5a040>

Bu sizga instance qaysi classga tegishli ekanligini va oxiridagi o'n oltilik qiymat ob'ektning xotira manzilini ko'rsatadi. Biroq, bu juda foydali emas. Ballning turini va ehtimol rangini chop etish yaxshi bo'lar edi.

Keling, chop etishni yanada foydaliroq qilish uchun "magic method"ni yangilaymiz. ball.py faylidagi kodni nusxalab, yangi faylga ball_printable.py deb nomlang va uni quyidagicha tahrirlang:

# ball_printable.py
 
class Ball:
 
    def __init__(self, color: str, size: float, weight: float,
                 ball_type: str) -> None:
        self.color = color
        self.size = size
        self.weight = weight
        self.ball_type = ball_type
 
    def bounce(self):
        if self.ball_type.lower() == 'bowling':
            print("Bowling balls can't bounce!")
        else:
            print(f"The {self.ball_type} ball is bouncing!")
 
    def __repr__(self):
        return f"<Ball: {self.color} {self.ball_type} ball>"
 
if __name__ == "__main__":
    ball_one = Ball('black', 6, 12, 'bowling')
    ball_two = Ball('red', 12, 1, 'beach')
    print(ball_one)
    print(ball_two)

Bu yerda siz yangi __repr__() magic methodini qo'shdingiz, bu esa ob'ekt chop etilganda chiroyli string ko'rinishini yaratish uchun ishlatiladi. Ob'ektning instance'ini chop etmoqchi bo'lganingizda, Python sizda __repr__() yoki __str__() aniqlanganini tekshiradi. Ko'pincha, __repr__()ni dasturchilar uchun xatolarni tuzatish vositasi sifatida ishlatish tavsiya etiladi.

Ushbu kodni ishga tushirsangiz, quyidagi natijani olasiz:

<Ball: black bowling ball>
<Ball: red beach ball>

Agar siz __str__()ni ham qo'shsangiz, u chop etilganida __repr__()ni haqiqatan ham almashtiradi. Mana bir misol:

# ball_printable.py
 
class Ball:
 
    def __init__(self, color: str, size: float, weight: float,
                 ball_type: str) -> None:
        self.color = color
        self.size = size
        self.weight = weight
        self.ball_type = ball_type
 
    def bounce(self):
        if self.ball_type.lower() == 'bowling':
            print("Bowling balls can't bounce!")
        else:
            print(f'The {self.ball_type} ball is bouncing!')
 
    def __repr__(self):
        return f'<Ball: {self.color} {self.ball_type} ball>'
 
    def __str__(self):
        return f'{self.color} {self.ball_type} ball'
 
if __name__ == "__main__":
    ball_one = Ball('black', 6, 12, 'bowling')
    ball_two = Ball('red', 12, 1, 'beach')
    print(ball_one)
    print(ball_two)
    print(f'{ball_one.__repr__()}')
    print(f'{ball_one.__str__()}')

Ushbu kodda siz __str__() metodini qo'shdingiz va u __repr__()ga juda o'xshash stringni qaytaradi, faqat u stringga class nomini qo'shmaydi. Keyin farqni ko'rsatish uchun, siz ball ob'ektlarini chop etdiniz. Nihoyat, siz __repr__() va __str__()ni to'g'ridan-to'g'ri chaqirganingiz natijasini chop etdiniz. Natijangiz quyidagi ko'rinishda bo'ladi:

black bowling ball
red beach ball
<Ball: black bowling ball>
black bowling ball

Bu Pythonning magic metodlari bilan qilishingiz mumkin bo'lgan ishlarning faqat bir qismi.

Ushbu sahifada

Xato haqida xabar berish