Bound Method Hakkında

Şu an üzerinde çalıştığım kodlarda hangi method hangi sınıfa ait mantığını kavramak için çözmeye çalışıyorum. Deneme yanılma yaptım fakat bir noktada kafam karıştı. Çünkü bound method gibi bir ifade ile karşılaştım. istihza-belgeleri’nde bound gibi bir ifade ile karşılaştığımı hatırlamıyorum.

#!/usr/bin/env pybricks-micropython
from pybricks import ev3brick as brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import (Port, Stop, Direction, Button, Color,
                                 SoundFile, ImageFile, Align)
from pybricks.tools import print, wait, StopWatch
from pybricks.robotics import DriveBase

# Write your program here
print(dir(brick))

Şimdi istihza belgelerinden öğrendiğim kadarı ile;
İlk satırda pybricks paketi içerisinden ev3brick modülü import edilmiş ve bu modüle brick takma ismi verilmiş
brick isimli modülün barındırdığı sınıf, method, değişken v.s. bakmak için dir() fonksiyonunu kullanıyorum. Aşağıdaki çıktı geliyor;
['__class__', '__name__', 'battery', 'buttons', 'exit', 'light', 'stderr', 'Display', 'display', 'Speaker', 'sound']

Bu çıktı içerisinde Speaker ve sound’u araştırıyorum.

print("Speaker'ın Tipi: ",type(brick.Speaker),"\n sound'un Tipi:",type(brick.sound))

Speaker ın Tipi:  <class 'type'> 
sound un Tipi: <class 'Speaker'>

Bu çıktılardan Speaker’ın bir sınıf olduğunu anlıyorum. Sound’un ise yukarıda gösterdiğim dir(brick) komut çıktısına göre Speaker dışında bir method olması gerekiyordu fakat bu son çıktıya göre Speaker’a ait gibi görünüyor. Speaker’ın içini araştırıyorum;

print(dir(brick.Speaker))

['__class__', '__init__', '__module__', '__name__', '__qualname__', 'file', '_valid_devices', 'beep', 'beeps', 'tune', 'speech']

Bu çıktıda sound’u göremiyorum. sound’un içeriğini irdeliyorum;

print(dir(brick.sound))

['__class__', '__dict__', '__init__', '__module__', '__qualname__', 'file', '_valid_devices', 'beep', 'beeps', 'tune', 'speech', '_device', '_loaded_files']

İkisinin de içinde 'beep', 'beeps', 'tune', 'speech' method ya da nitelikleri bulunuyor. Bu çıktıdan hareketle beep’i irdeliyorum.

print(type(brick.Speaker.beep))
<class 'function'>

print(type(brick.sound.beep))
<class 'bound_method'>

Son çıktıdaki bound_method ne anlama geliyor? sound Speaker’a ait mi değil mi kafam iyice karıştı. Tabi şunu da belirtmek isterim burada sizi rahatsız etmeden önce internetter araştırma yapıyorum. bağlı method olduğu ile ilgili birkaç okuma yaptım lakin tam mantığını anlamadım.

Lafı çok uzatıyorsam özür dilerim, derdimi iyi anlatmak için gidiş yolumu ve sorunumu iyice açıklamaya çalışıyorum.

Basit bir örnek ile bound method ile function arasındaki farkı açıklamaya çalışayım. Bu arada ikisi de fonksiyon demek.

class A:
    def f(): pass


print(A.f)
# <function A.f at 0x7fb4e8e7bc80>

print(A().f)
# <bound method A.f of <__main__.A object at 0x7fb4e87c8d68>>

Yani bound method bir sınıf örneğine bağlı olan fonksiyondur.

1 Like

Hocam yukarıdaki örnekte
sound = Speaker() gibi bir kod olduğu için mi çıktıları öyle gördüm? Dediklerinizden bunu anladım.

Yani muhtemelen bir sınıfın örneğine ait o fonksiyon, bu yüzden bound method olarak nitelendiriliyor diye tahmin ediyorum.

Peki hocam bound kullanımının faydası ya da amacı nedir?

Bazen bir sınıftan bir örnek oluşturmanız gerekir. Ve o örneği oluşturduktan sonra örneği kullanan her bir fonksiyon artık bound fonksiyondur. Yani örneğe bağlı fonksiyondur.

1 Like

Peki çok teşekkür ederim, yorduysam kusura bakmayın. Sindirerek gitmeye çalışıyorum.

1 Like

Rica ederim, yormadınız. En iyisini yapıyorsunuz.

1 Like