2015-03-01 21 views
6

Yöntem özniteliği ve veri özniteliği nedir? Aralarındaki ortak fark nedir?Veri öznitelikleri ve yöntem öznitelikleri arasındaki farklar

Python 2.7.9 (https://docs.python.org/2/tutorial/classes.html#random-remarks) okuyordum ve aniden anlaşılması zorlaştı. Üzerine biraz ışık tutacağım. veri niteliği ile basitçe bir değer adı olan bir şırınga haznesine Bu durumda

class Dog: 
    def __init__(self): 
     self.name = "Rufus" 

    def bark(self): 
     print "Woof Woof!" 

:

cevap

9

Öznitelik, nokta sözdizimini kullanarak başka bir nesneye bakan bir değişkendir: obj.attribute. Python'un tasarlanma şekli, öznitelik aramaları çeşitli şeyler yapabilir ve bu ne olup bittiğini gerçekten anlayamazsanız, bu çeşitlilik bazen hatalara yol açabilir (bu, bağlandığınız belgelerle ilgili olarak uyarır).

En temel sorun, bir öznitelik aramasının, nesnenin örnek sözlüğünde saklanan bir değeri bulabilmesi veya nesnenin sınıfından (veya miras kalıyorsa bir temel sınıf) bir şey bulabilmesidir. Yöntemler sınıfta saklanan işlevlerdir, ancak genellikle bunları bir örneğe bakarak (yöntemi "bağlayan", yöntemi çağrıldığında nesnenin ilk argüman olarak eklenmesiyle) kullanırsınız.

Ne zaman karmaşık bir şekilde kontrol edildiğinin tam sırası (tüm işlemi an answer to another question'da tanımladım), ancak en temel düzeyde örnek öznitelikleri genellikle sınıf özniteliğine göre önceliklidir.

Örnek adı ve aynı ada sahip bir sınıf özniteliği her ikisi de varsa, genellikle yalnızca örnek özniteliği erişilebilir olacaktır. İstenmeyen ise bu çok kafa karıştırıcı olabilir.

Aşağıdaki kodu düşünün:

class Foo(object): 
    def __init__(self, lst): 
     self.lst = lst 

    def sum(self): 
     self.sum = sum(self.lst) 
     return self.sum 

f = Foo([1,2,3]) 

print(f.sum()) 
print(f.sum()) 

Bu kodun altına, iki özdeş aramalar yapmak. İlk iş gayet iyi, ama ikincisi bir istisna artacaktır.

f.sum ilk kez baktığımızda, Foo sınıfında bir yöntem buluyoruz. Yöntemi hiçbir sorun olmadan arayabiliriz. Sorun, sum yönteminin sum yönteminin hesaplamasını (self.lst öğesinin toplamı) sum olarak adlandırılan örnek özniteliğine atamalarından kaynaklanmaktadır. Bu, sum yöntemini görünümden gizler.

İkinci f.sum() numaralı çağrı, f.sum numaralı telefona baktığında, beklenen yöntem yerine tamsayı 6'u içeren örnek özniteliğini bulur. Bir tamsayı callable değil, bu yüzden bir istisna alırız.

Çözüm, elbette, yöntem ve öznitelik için aynı adı kullanmamaktır. Yukarıdaki kod oldukça önemsiz bir örnektir. Bu tür bir şeyin daha karmaşık koddaki nedenlerden kaynaklanabilecek hatalar daha da zor olabilir.

Çok fazla bilmediğiniz nesnelere nitelik katan kod yazıyorsanız, genel adlardan kaçınmaya dikkat etmelisiniz. Bir mixin sınıfı yazıyorsanız, tam olarak bu tür bir durum için tasarlanan Python'un ad manganlamasını tetiklemek için özellik adlarında iki önde gelen alt çizgi kullanmayı düşünün.

+0

Açıklamanız oldukça basittir. Bu yüzden bana bağlandığım belgelerin 'data attribute' = 'instance attribute', 'method attribute' = 'class attribute' anlamına gelmesini istediğini görüyorum. Eğer yanılıyorsam lütfen beni düzeltin. –

+0

Evet, doğru. Belgelerin oldukça eski ve tamamen güncel olmayabilir düşünüyorum. Şüphesiz, "örnek özniteliği" ve "sınıf özniteliği" bu günlerde çok daha yaygın terimlerdir. Ayrıca, gerçek durumun burada sunduğumdan biraz daha karmaşık olduğunu da belirtmek gerekir. Bazı sınıf öznitelikleri (ör. 'Property' nesneleri) örnek özniteliklerine göre öncelikli olacaktır. Bununla birlikte, bu durumda, sonuç olarak, son derece muhtemeldir. – Blckknght

3

bir özellik, örneğin, bir nesneye bağlanmış olan, daha iyi bir kelime olmaması herhangi bir şey, Köpeğin örneğine bağlı. Yöntem özniteliğine gelince, bir cevap, bir yöntem olduğu kadar çok bir değere sahip olmadığı için kabuk yöntemi olacaktır. İngilizcede olduğu gibi. Bir veri özelliği tam olarak göründüğü gibi; Bu veriler, sadece bir özelliktir. Bir yöntem bir prosedürdür, eylemdir ve bu tam olarak bir yöntem niteliğidir.

1

Bir özellik temel olarak instance.attribute_name ile yapabileceğiniz bir şeydir. Mesela:

class Hello(object): 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print "Hello: "+self.word 

__init__, greet ve word tüm nitelikleri olurdu. Bir yöntemin sınıf kapsamındaki def ile bildirilen bir şey olduğunu tahmin ediyorum (örneğin self.func = lambda x: x * x yerine). Bu durumda bağlanmamış vs karşılanmamış yöntemlere ve benzerlerine girersiniz. Bir üye özniteliği instance.method_name yaptığınızda önemli bir parçası olmanız önemli bir parçası, geri döndüğünüzde, ilk argüman olarak örnekle özgün yöntemi çağıracaksınız. Ayrıca, bu bölümün bazılarını okuduktan sonra, ifadeleri biraz kafa karıştırıcı/hatalıdır. Örneğin, "Veri nitelikleri, aynı ada sahip yöntem özniteliklerini geçersiz kılar" dır, bildiğim kadarıyla, örnek özniteliği, aynı ada sahip sınıf özniteliklerini geçersiz kılar. Sonra yapabilirdi

class Hello(object): 
    greeting = "Hello: " 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print self.greeting+self.word 

: biz selamlaşma sınıf niteliği üzerinde selamlama bir örnek niteliği koymak olmasından kaynaklanmaktadır

>>> a = Hello("world") 
>>> a.greeting = "Goodbye " 
>>> a.greet() 
"Goodbye world" 

Biz bu genişletilmiş Örneğin itibaren ben verdi. Sınıfta tanımlanan yöntemler (normal yol) sınıf öznitelikleri olduğundan, bunlar herhangi bir öznitelik öznitelikleri tarafından geçersiz kılınacaktır (veri veya başka türlü).

0

Burada, bir öznitelik ile bir yöntem arasındaki farkı anlamamda bana yardımcı olan, doğrudan ve açık bir açıklama açıklanmaktadır.

Bir sınıf, özellikleri paylaşan birçok nesnenin nasıl oluşturulacağına ilişkin bir dizi talimat veya plana benzer.

Nesne, sınıf tanımının sağladığı özelliklere göre oluşturulan bir veri türüdür.

Bir özellik bir değerdir (karakteristik). Bir özelliği, bir nesne içinde saklanan değişken olarak düşünün.

Bir yöntem, bir talimat kümesidir. Yöntemler, bir nesne ile ilişkilendirilmiş işlevlerdir. Üst sınıf tanımında yer alan herhangi bir işlev, o sınıfın bir nesnesi tarafından çağrılabilir.

Umarım bu yardımcı olur.