2013-06-08 12 views
6

Python'da çok yeniyim ve Python 3.3.1 kullanıyorum.Bir yöntemi çağırmak ve bir özniteliğe erişme arasındaki fark

Şimdi
class Parent: # define parent class 
    parentAttr = 100 
    age = 55 

    def __init__(self): 
     print ("Calling parent constructor") 

    def setAttr(self, attr): 
     Parent.parentAttr = attr 

class Child(Parent): 
    def childMethod(self): 
     print ('Calling child method') 

Ben yöntemleri ve atrributes arasında nasıl ayırt edebilir

c=child 
c.[here every thing will appear methods and attr (age,setAttr)] 

oluştururuz? c.SetAtrr(Argument) ve c.SetAtrr=value'u ne zaman kullanırım?

+0

Sınıf dökümantasyonu, hangi özelliklerin çağrılması gereken yöntemler olduğunu ve değeri güvenli bir şekilde değiştirebileceğiniz nitelikler olduğunu söylemelidir. – chepner

cevap

11

Yöntemler özniteliklerdir. Sadece kalınabilir nesneler olurlar.

bir nesne kullanarak çağrılabilir olup olmadığını tespit edebilen callable() function:

>>> def foo(): pass 
... 
>>> callable(foo) 
True 
>>> callable(1) 
False 

Eğer bir yöntemi çağırdığınızda, (a getattr() işlemi) özelliği aramak ve sonra sonucu çağırır:

c.setAttr(newvalue) 

iki adımdır; özniteliği bulmak (bu durumda, özniteliği sınıfta arar ve bunu bir tanımlayıcı olarak görür), sonuçta ortaya çıkan nesneyi, bir yöntemi çağırır.

Eğer bir özellik atamak

, yeni bir değere o ismi yeniden bağlamanız:

c.setAttr = 'something else' 

bir setattr() operasyonu olurdu. Eğer alma ve sınıfın örneklerinde özellikleri ayarlayarak kesmek istiyorsa

, sen attribute access hooks, __getattr__, __setattr__ ve __delattr__ sağlayabilir. Bir örneğine bir yöntem eklemek istiyorsa

, bir yöntem nesnesi üreten bir descriptor object olarak işlev tedavi etmek gerekir:

>>> class Foo: pass 
... 
>>> foo = Foo() # instance 
>>> def bar(self): pass 
... 
>>> bar 
<function bar at 0x10b85a320> 
>>> bar.__get__(foo, Foo) 
<bound method Foo.bar of <__main__.Foo instance at 0x10b85b830>> 

dönüş değeri function.__get__() arasında verildiğinde bir Örnek ve bir sınıf, bağlı bir yöntemdir. Bu yöntemin çağrılması, örneğe bağlı olan self ile temel işlevi çağırır.

Ve tanımlayıcılardan bahsetmişken, property() function da bir tanımlayıcı döndürür; bu, 'un öznitelikleri gibi davranmasını sağlar; Sırf o özellik için getattr(), setattr() ve delattr() operasyonlarını durdurmak ve bir işlev çağrısı dönüştürebilirsiniz:

.bar Erişme
>>> class Foo: 
...  @property 
...  def bar(self): 
...   return "Hello World!" 
... 
>>> foo = Foo() 
>>> foo.bar 
"Hello World!" 

sonra orijinal bar yöntemini çağıran bar özelliğin get kanca, çağrılan.

Neredeyse her durumda, callable() işlevine ihtiyacınız olmayacak; API'nızı belgelendirir, yöntemler ve öznitelikler sağlarsınız ve API'nizin kullanıcısı, her bir özniteliği, denetlenebilir olup olmadığını görmek için test etmeden çözer. Özelliklerle, her durumda gerçekten kalible olan öznitelikleri sağlama esnekliğine sahipsiniz.

+0

So .. c.SetAtrr = value ve c.SetAtrr (Value) kullanabilir miyim ve aynı mı olacak? – D007a

+0

@disasterromio: Hayır, biri özniteliği ayarlıyor, diğeri işlevi çağırıyor. –

+0

U saatiniz için teşekkür ederiz En iyi uygulama, nesnenin heceli olup olmadığını kontrol etmektir? – D007a

İlgili konular