Bir saat öncesine kadar, python Foo().bar()
öğesinde, örneği ilk parametre olarak geçiren Foo.bar (Foo())
için kısa bir elden başka bir şey olmadığına ikna oldum.Python yöntemi araması, static vs. örneği
class Foo (object):
def bar (self): print "baz"
qux = Foo()
qux.bar()
Foo.bar (qux)
Ama şimdi insanoğlunun bildiği tüm hayvanların bir listesini döndüren bir statik yöntem olarak doldurulur() olan bir sınıf Hayvan vardır: Bu örnekte son iki satır (görünüşte) aynı işi görüyor. Ayrıca, her bir Animal örneğinin, örneğinin özelliklerini rastgele değerler ile dolduran bir yöntem populate() vardır.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import random
animals = [ ("Bella", "cow"), ("Spike", "dog"), ("José", "iguana"), ("Tux", "penguin") ]
class Animal (object):
@staticmethod
def populate (*args): return map (lambda x: Animal (*x), animals)
def __init__ (self, name = None, species = None):
def bar(): self.name, self.species = random.choice (animals)
self.name = name
self.species = species
self.populate = bar
def __repr__ (self): return "%s of species %s" % (self.name, self.species)
print Animal.populate()
print Animal ("Pinky", "mouse")
qux = Animal()
qux.populate()
print qux
kod çalışıyor ama ne beni şüpheli yaptı print Animal.populate (qux)
statik doldurmak yöntemi denilen (ve dolayısıyla bir liste döndü ve kötü qux doldurmak vermedi) olmasıydı. Görünüşe göre, Foo().bar()
'un Foo.bar (Foo())
için kısa bir elden başka bir şey olmadığı kanaatim yanlış.
Bu benim için çeşitli sorular ortaya:
- ben
Foo().bar()
nasıl hitap oluyorsa ne zaman? Foo.bar (Foo())
numaralı telefonu aradığımda ne olur?- Her ikisi arasında bir iç fark var mı?
- Bazı temel python kavramlarını kaçırmıyorum?
- Statik populasyon yöntemi, bu sınıfın bir örneği üzerinden çağrılan populate yönteminden başka bir şey yapan bir sınıf yazmak zorunda kalsaydınız, bu da hangisi olur?
(Evet aynı adı olmalıdır.)
Daha ilginç bir başlık, "Python yöntemi araması, statik vs. örneği" olacaktır. Bu terminolojiyi kullanarak daha fazla cevap alabilirsiniz, biraz daha teknik ve çekici. – slezica
@Santiago Giriş için teşekkürler. Başlığı değiştirdim. – Hyperboreus
'()' etrafındaki tüm ekstra boşluklar gözlerimi –