Sınıf dışından örnek niteliği tanımlama

Aşağıdaki örnekte de olduğu gibi sınıfa sınıfa dışarıdan müdahele ederek sınıf nesnesine nesne niteliği ekledim.Bu durumla slots kavramını incelerken karşılaştım.Daha önce Ekrem bey bir sorunun çözümünde kullanmıştı bu sihirli metodu benim anladığım slots kavramı nitelik sayısına bir kısıtlama getiriyor.Onun için kullanılıyor diye düşünüyorum.Bunu daha detaylı açıklayabilirseniz sevinirim.
Asıl soruya gelirsek sınıfın nesnesine dışardan nitelik eklemek nasıl mümkün olabiliyor?

class sayı():
    def __init__(self):
        self.nitelik1=1
        self.nitelik2=2
nesne=sayı()
print(nesne.nitelik1)
print(nesne.nitelik2)
nesne.nitelik3=3
print(nesne.nitelik3)

Bir metod değil, nitelik. Şunun gibi:

class Point():
    __slots__ = ("x", "y")

Niteliklere sınırlama getiriyor, evet.

Bazı mikro optimizasyonlar için de kullanılıyor.

Sınıfın örneklerinin sahip olabileceği niteliklerin adını bir tuple içine yazıp __slots__ değişkenine atıyoruz, bu kadar.

Dil izin verdiği için. Niye mümkün olamasın?

Normalde örnek nitelikleri, örneğe ait bir sözlük içinde tutuluyor zaten. Sözlüklerin sahip olabileceği anahtar sayısının da hafızadan başka sınırı yok:

class Foo():
    ...

bar = Foo()
print(bar.__dict__)

bar.attribute = 1
print(bar.__dict__)

bar.another_attribute = 2
print(bar.__dict__)

bar.__dict__["another_attribute"] = 3
print(bar.another_attribute)

Daha ayrıntılı olarak burada anlatılmış:

2 Beğeni

Dil izin verdiği için dediniz ama mesela dil dışardan metod atamaya izin veriyor mu denemedim ama sanmıyorum.Aslında dil bu duruma nasıl izin veriyor diyelim ona birde neden böyle bir şeye izin veriyor olabilir onu da tam anlamlandıramadım.Yani dışardan tanımlamanın ne artısı olabilir.Bu sonradan eklediğim niteliği bir metodda kullanabilir miyim ?(denemedim ama sanmıyorum) gereksiz gibi geldi açıkçası ama kesinlikle değildir :slight_smile:

Benim anladığım şu bir nesne oluşturunca bir sözlük oluşuyor ve ben dışardan bu nesneye bir nitelik atarsam bu o sözlüğe ekleniyor ve sadece benim oluşturduğum o tek nesneye ait bir nitelik oluyor. Başka bir nesne oluştursam o nesnenin öyle bir niteliği olmayacak.
Aslında yaptığım o nesnenin sözlüğüne eleman eklemekten başka birşey değil?
Acaba bu tek nesneye ait niteliği kullanabildiğim sınıf içinde bir metod oluşturabilir miyim PC başına geçince deneyeceğim :slight_smile:

Evet:

from types import MethodType

class Foo():
    ...

bar = Foo()
bar.attr = "hello world"
bar.print = MethodType(lambda self: print(self.attr), bar)
bar.print()

Veya:

class Foo():
    ...

bar = Foo()
bar.attr = "hello world"
bar.print = (lambda self: print(self.attr)).__get__(bar)
bar.print()

Aslında dilin tasarım şeklinin doğal bir sonucu/getirisi, çok da şart olan bir özellik değil.

Evet.

2 Beğeni

dışardan olmayan bir nitelik eklemek bana pek doğru bir karar gibi gelmiyor açıkçası :confused:

Nitelik eklemek bir yana, şöyle şeyler bile mümkün:

class Foo:
    ...

class Bar:

    def do_bar_thing(self):
        print(self.attr)


o = Foo()
o.attr = "hello"
Bar.do_bar_thing(o)

Python duck typed bir dil, daha sınırlayıcı tip sistemleri istiyorsanız başka bir dil kullanabilirsiniz.

1 Beğeni

şimdi anladığım kadarıyla __slots__sınırlıyor nitelikleri böylece optimiazyonlar yapılabiliyor peki ne tür optimizasyonlar? _dict_ in bellekteki boyutunu mu sınırlıyor? ayrıca bu konuyu araştırırken member_descriptor diye bir şey gördüm onun ne olduğunu pek anlamadım biliyorsanız link veya açıklama atarsanız çok sevinirim :slight_smile:

Yukarıda attığım linke bakın.

1 Beğeni

_slots_ u nerelerde kullanmalı nerelerde kullanmamalıyız? veya slots kullanmanın faydaları neler oldu sizin açınızdan?

2 Beğeni