2010-01-31 14 views
7

Python'da temel amacı temel bir veri özniteliğinin değerini (yani iç destek deposu) almak olan bir genel yönteminiz olduğunu varsayalım. Yöntem, tembel değerlendirme mantığına, vs. sahip olabilir. Bir özellik, böyle bir yöntemin bir örneğidir. Daha sonra, veri niteliği için alt çizgi öneki hariç, yöntem ve veri özniteliği için aynı adı kullanmak doğaldır. (Python's "property" documentation itibaren) sonra, örneğinPython'da, bir iç özelliğin yedekleme deposu için tercih edilen bir adlandırma kuralı nedir?

class C(object): 
def __init__(self): 
    self._x = None 

@property 
def x(self): 
    """I'm the 'x' property.""" 
    return self._x 

Ama yöntem dahili kullanım için ise bazı tercih konvansiyonlar nelerdir ve bu yüzden kendisi bir alt çizgi öneki için mi? Destek mağazasının iki önde gelen alt çizgi ile ön eklenmesi, ad manganlamasını başlatır ve bu nedenle ideal değildir.

İki olasılık

def _get_x(self): 
    return self._x 

def _x(self): 
    return self._x_ 

Python stili (alt çizgi ekleme) ikinci diyor göre-- olabilir, ama, sadece ayrılmış anahtar kelimelerle çatışmaları önlemek için kullanılmalıdır.

+0

Ben yorumları, -1 puan olamaz sevindim. –

+0

Özel bir mülk sahibi olmanın birçok insanı kafasını karıştıracağını düşünüyorum. Kendi sınıfınızı 'property' denilen, belki de 'cached_property'den türetmenizi ve' __get__' 'yi tanımlamak için getter çağrısında bulunmayı öneririm ve eğer varsa, döndürdüğü değeri döndürür. aradı. Ve önbelleğe alınan değeri unutmak için '__delete__' tanımlayın. – Omnifarious

+0

Sadece kendim için bunlardan birini yazdım, yapılıp yapılamayacağını görmek için. Ve gerçekten de olabilir, ama bu biraz çirkin ve zayıf referanslar kullanılmasını gerektirir, yani mülkün konulduğu sınıfın zayıf referansa sahip olması gerektiği anlamına gelir. – Omnifarious

cevap

1

Dahili kullanım için neden bir özellik yapardınız? Dahili kullanım için ise, doğrudan özniteliğe erişin.

Ama sonra yine bir alt çizgi kullanırsınız, ama başka bir şey de. Ama yine de, bu durumda bir mülk haline getirmenin bütün noktası kaybolur.

+2

Mantık yürütmesi gerekiyorsa, örneğin tembel değerlendirme gibi bir özellik yapmak istersiniz. – cjerdonek

+0

Ve sonra bu yöntemi doğrudan, iç olduğunda arayabilirsiniz. –

+1

-1 çünkü bu bir cevap değil, ilk başta soruyu yanlış anladım ve bu yüzden sorunuza yanlış cevap verdim. @Chris J'nin iyi bir cevabı var. – Omnifarious

3

Tercih edilen sözleşme, tek bir önde gelen alt çizgi kullanmaktır.

Özel nitelikler için PEP 8 önerisi.

özellik için docstringe() bu örneğe bakın:

>>> help(property) 
Help on class property in module builtins: 

class property(object) 
| property(fget=None, fset=None, fdel=None, doc=None) -> property attribute 
| 
| fget is a function to be used for getting an attribute value, and likewise 
| fset is a function for setting, and fdel a function for del'ing, an 
| attribute. Typical use is to define a managed attribute x: 
| class C(object): 
|  def getx(self): return self._x 
|  def setx(self, value): self._x = value 
|  def delx(self): del self._x 
|  x = property(getx, setx, delx, "I'm the 'x' property.") 
| 
| Decorators make defining new properties or modifying existing ones easy: 
| class C(object): 
|  @property 
|  def x(self): return self._x 
|  @x.setter 
|  def x(self, value): self._x = value 
|  @x.deleter 
|  def x(self): del self._x 
| 
İlgili konular