Python ile bir üst nesnenin değişkenine ulaşmak

class A:
    attr1 = "A"

    class B:
        print(attr1)

Örnek veriyorum bunu nasıl yazdırabiliriz?

1 Beğeni
class A:
    global attr1
    attr1 = "A"

    class B:
        print(attr1)
3 Beğeni
class A():
    def __init__(self):
        self.attr1 = "A"

class B(A):
    def __init__(self):
        super().__init__()
        print(self.attr1)
        
x = B()

Output

A
2 Beğeni

Merhaba, ben böyle bir durumda şu yapıyı tercih ederdim.

class d:
    class f():
        def __init__(self, d_self):
            print("f", self)    
            print("d", d_self)

    def __init__(self):
        # print("d", self)
        x = self.f(self)

G = d()

d class in içindeki self, f ye parametre olarak geçtiğimiz d_self in bizzat ama bizzat kendisidir. İnanmıyorsan id fonksiyonuyla işlerini karşılaştır. d_self de yapacağın değişiklik, f nin self ini de etkiler. Birkaç kaynak daha bulursam editleyip göstermek isterim. Maalesef hiç vaktim yok şu anlık, vize haftası.

1 Beğeni

Yazdiramayiz cunku daha A ve B siniflari tanimli degil.

Bu ust sinifin degil, global scope’taki A.

Kodu method icine aliyorsak baska bir degisiklige gerek yok:

class A:
    attr1 = "A"

    class B:
        def foo():
            print(A.attr1)

x = A.B.foo()
3 Beğeni

Peki bir A nesnesinin attr1’ine nasıl ulaşacağız? Örneğin attr1 nesne oluşturulurken başka bir değer alabilir.

bir_a_nesnesi.attr1

Sınıfın içinden ulaşmaya çalışıyorum. Daha ortada üretilmiş bir nesne yok yani. Dışarıdan ulaşsam dediğiniz olur. Yani basit anlamda bir üst elemanın self’ine erişmeye çalışıyorum.

Doğrusu ne demek istediğinizi anlamadım, az önce bir nesnenin niteliğine nasıl ulaşacağınızı sormadınız mı?


"Üst elemanın self"i ne demek bilmiyorum ama A sınıfını kastediyorsanız bu cevaplanmış zaten:


Bu arada sınıflar “içinde tanımlanmış olma” gibi bir hiyerarşik sisteme sahip değiller, o yüzden sınıflarınızı farklı bir şekilde düzenlemeniz işinizi kolaylaştırabilir.

2 Beğeni

Siz bir sınıfın niteliğine ulaşıyorsunuz bense bir nesnenin içeriğine ulaşmak istiyorum. Hiyerarşiyi değiştirmem lazım eğer yöntemini bulamazsam.

Hocam benim yazdığım kod işinizi görür, ama dedikleri gibi hiyerarşiyi değiştirmek çok daha iyi olabilir, bilemem.

Şimdi o kaynakları gösterebilirim.
https://gist.github.com/itu-itis21-altiparmak20/1466bf4e85cadadc3b7c7a4ffbf182c2

Bu yazdığım kodda bunun örneği var, bizzat deneyerek gördüm, kaynağım bu.

    orc   = Orcs("Orcs", 10, 20 ,30, 40)
    dwarf = Dwarves("Dwarves", 11, 21, 31, 41)
    elf   = Elves("Elves", 12, 22, 32, 42)
    merchant = Merchant(5, 4)

    orc.AssgnEnemies(dwarf, elf)
    dwarf.AssgnEnemies(orc, elf)
    elf.AssgnEnemies(orc, dwarf)
    merchant.AssgnFactions(orc, dwarf, elf)

Eğer yazdığım kodu incelemisseniz böyle bir parça göreceksiniz. Burada her karakter için onların düşmanlarını atiyoruz. Ve sonra atak yaptığımızda assign ettiğimiz düşmanların canı vs. azalıyor. Bu benim için güzel bir deneyimdi :slight_smile:

Bu arada kod, proje takımlarına girmek için yazdığım basit bir mülakat kodu gibi bir şeydi. Basit bir konsolda text oyunu :slight_smile:

Sağ olun hocam, teşekkür ederim, bilgim tazelendi, ama ben de olayı bir instance ı tabiri caizse bir alt class ta kullanmak diye anlamıştım.

Hepsi mumkun; hatta belki python sihiriyle tam olarak soruda sorulani yapmak da mumkundur ama dogru degil.

Sizin cozumun dogrulugundan da emin degilim, yapilmak istenene gore dogru da olabilir, daha “dogru” (okumasi, yazmasi kolay, maintain edilebilir) bir cozum de olabilir. Bilmedigim icin yorum yapmadim.

1 Beğeni