एक घंटे पहले तक, मुझे विश्वास था कि पाइथन Foo().bar()
Foo.bar (Foo())
के लिए एक छोटा सा हाथ से अधिक कुछ नहीं था जो उदाहरण को पहले पैरामीटर के रूप में पास करता है। इस उदाहरण में अंतिम दो पंक्तियों करना (जाहिरा तौर पर) एक ही बात:पायथन विधि लुकअप, स्थैतिक बनाम उदाहरण
class Foo (object):
def bar (self): print "baz"
qux = Foo()
qux.bar()
Foo.bar (qux)
लेकिन अब मैं एक वर्ग पशु एक स्थिर विधि से भरें() कि इंसान को मालूम सभी जानवरों की सूची लौटाता है कि है। इसके अलावा पशु के प्रत्येक उदाहरण में एक विधि पॉप्युलेट() है जो उदाहरण के गुणों को यादृच्छिक मानों से भरती है।
#! /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
कोड ठीक काम करता है, लेकिन क्या मुझे संदिग्ध बना तथ्य print Animal.populate (qux)
कहा जाता है कि स्थिर रूप से भरें विधि (और इसलिए एक सूची लौट आए और गरीब qux पॉप्युलेट नहीं था) था। तो स्पष्ट रूप से मेरा दृढ़ विश्वास कि Foo().bar()
Foo.bar (Foo())
के लिए एक छोटा सा हाथ से कुछ भी गलत नहीं था।
यह मेरे लिए विभिन्न सवाल उठे:
- क्या होता है जब मैं
Foo().bar()
कहते हैं? - क्या होता है जब मैं
Foo.bar (Foo())
पर कॉल करता हूं? - क्या दोनों के बीच कोई आंतरिक अंतर है?
- क्या मुझे अजगर की कुछ मौलिक अवधारणा याद आ रही है?
- यदि आपको ऐसी कक्षा लिखनी पड़ेगी जिसकी स्थिर आबादी विधि इस वर्ग के उदाहरण पर आबादी वाले विधि से कुछ और करती है, तो कौन सा रास्ता होगा?
(हाँ, यह एक ही नाम होना चाहिए।)
एक और दिलचस्प शीर्षक "पायथन विधि लुकअप, स्थैतिक बनाम उदाहरण" होगा। आपको उस शब्दावली का उपयोग करके अधिक उत्तर मिल सकते हैं, यह थोड़ा और तकनीकी और आकर्षक है। – slezica
@ सैंटियागो इनपुट के लिए धन्यवाद। मैंने शीर्षक बदल दिया। – Hyperboreus
'()' के आसपास की सभी अतिरिक्त रिक्त स्थान मेरी आंखों को चोट पहुंचाती हैं –