En general, estoy confundido acerca de la diferencia entre una "propiedad" y un "atributo", y no puedo encontrar un gran recurso para detallar de manera concisa las diferencias.¿Cuál es la diferencia entre una "propiedad" y un "atributo" de Python?
Respuesta
Las propiedades son una clase especial de atributo. Básicamente, cuando Python se encuentra con el siguiente código:
spam = SomeObject()
print(spam.eggs)
que mira hacia arriba en eggs
spam
, y luego examina eggs
para ver si tiene un __get__
, __set__
, o __delete__
método y thinsp; — & thinsp; si lo hace, es una propiedad. Si es una propiedad, en lugar de simplemente devolver el objeto eggs
(como lo haría con cualquier otro atributo) llamará al método __get__
(ya que estábamos haciendo la búsqueda) y devolverá el método que devuelva.
Más información sobre Python's data model and descriptors.
En términos generales, una propiedad y un atributo son la misma cosa. Sin embargo, hay un decorador de propiedades en Python que proporciona acceso getter/setter a un atributo (u otros datos).
class MyObject(object):
# This is a normal attribute
foo = 1
@property
def bar(self):
return self.foo
@bar.setter
def bar(self, value):
self.foo = value
obj = MyObject()
assert obj.foo == 1
assert obj.bar == obj.foo
obj.bar = 2
assert obj.foo == 2
assert obj.bar == obj.foo
podría por favor mencionar también el resultado esperado de este código? –
¿Qué quieres decir? ¿No está eso en la parte inferior del código? – six8
Con una propiedad que tiene el control completo sobre sus getter, setter y Deleter métodos, que usted no tiene (si no usa advertencias) con un atributo.
class A(object):
_x = 0
'''A._x is an attribute'''
@property
def x(self):
'''
A.x is a property
This is the getter method
'''
return self._x
@x.setter
def x(self, value):
"""
This is the setter method
where I can check it's not assigned a value < 0
"""
if value < 0:
raise ValueError("Must be >= 0")
self._x = value
>>> a = A()
>>> a._x = -1
>>> a.x = -1
Traceback (most recent call last):
File "ex.py", line 15, in <module>
a.x = -1
File "ex.py", line 9, in x
raise ValueError("Must be >= 0")
ValueError: Must be >= 0
Esto ("control completo") también se puede realizar con atributos "no-propiedad", sin estos simples decoradores. –
lo que llamé una advertencia ... – neurino
Me gusta que esta respuesta proporcione un ejemplo realista y útil. Siento que demasiadas respuestas en este sitio explican innecesariamente cómo funcionan las cosas en el back-end sin aclarar cómo el usuario debería interactuar con ellas. Si uno no entiende por qué/cuándo usar alguna funcionalidad, no tiene sentido saber cómo funciona detrás de las escenas. – Tom
La propiedad le permite obtener valores de consigna y como lo haría atributos normales, pero en el fondo hay un método que se llama traducirla en un getter y setter para usted. En realidad, es una gran ventaja reducir la repetición de llamados getters y setters.
Digamos, por ejemplo, que tenía una clase que contenía algunas coordenadas xey para algo que necesitaba. Para fijarlos es posible que desee hacer algo como:
myObj.x = 5
myObj.y = 10
Eso es mucho más fácil mirar y pensar en que escribir:
myObj.setX(5)
myObj.setY(10)
El problema es, ¿qué pasaría si un día los cambios de clase, tales que necesitas compensar tu xey con algún valor? Ahora necesitaría ingresar y cambiar la definición de su clase y todo el código que la llama, lo que podría ser muy lento y propenso a errores. La propiedad le permite usar la sintaxis anterior a la vez que le brinda la flexibilidad de cambiar la última.
En Python, puede definir getters, setters y eliminar métodos con la función de propiedad. Si solo desea la propiedad de lectura, también hay un decorador @property que puede agregar encima de su método.
aprendí 2 diferencias de site de Bernd Klein, en resumen:
1. La propiedad es una forma más conveniente de hacer la encapsulación de datos.
ex: Si tiene una longitud de atributo público de Object, más adelante, su proyecto requiere que lo encapsule, i.e: cambiarlo a privada y proporcionar get y set => tiene que cambiar muchos de los códigos que escribió antes:
#Old codes
obj1.length=obj1.length+obj2.length
#New codes(Using private attibutes and getter and setter)
obj1.set_lenght(obj1.get_length()+obj2.get_length()) #=> this is ugly
Si utiliza @property y lenght.setter @ => que no es necesario cambian los códigos viejos
2. Una propiedad puede encapsular múltiples atributos
class Person:
def __init__(self, name, physic_health, mental_health):
self.name=name
self.__physic_health=physic_health #physic_health is real value in range [0, 5.0]
self.__mental_health=mental_health #mental_health is real value in range [0, 5.0]
@property
def condition(self):
health=self.__physic_health+self.__mental_health
if(health<5.0):
return "I feel bad!"
elif health<8.0:
return "I am ok!"
else:
return "Great!"
En este ejemplo, __physic_health
y __mental_health
son privadas y no se puede acceder directamente desde fuera sid e, la única forma fuera de clase interactuar con ellos es a través de la propiedad condition
También hay una diferencia no obvia que uso para almacenar en caché o datos, a menudo tenemos una función conectada al atributo de clase. Por ejemplo tengo que leer el archivo de una vez y mantener el contenido asignado al atributo de modo se almacena en caché el valor:
class Misc():
def __init__(self):
self.test = self.test_func()
def test_func(self):
print 'func running'
return 'func value'
cl = Misc()
print cl.test
print cl.test
Salida:
func running
func value
func value
Se puede acceder al atributo dos veces, pero nuestra función fue despedido sólo una vez. Cambiar el ejemplo anterior para utilizar la propiedad hará que el valor del atributo actualizar cada vez que se accede a él:
class Misc():
@property
def test(self):
print 'func running'
return 'func value'
cl = Misc()
print cl.test
print cl.test
Salida:
func running
func value
func running
func value
- 1. Cuál es la diferencia entre Propiedad y Propiedad de Dependencia
- 2. ¿Cuál es la diferencia entre un padre y una propiedad de referencia en Google App Engine?
- 3. ¿Cuál es la diferencia entre una propiedad de lectura y una propiedad de asignación no atómica?
- 4. ¿cuál es la diferencia entre propiedad estática y singleton?
- 5. ¿Cuál es la diferencia entre una propiedad de dependencia y una propiedad adjunta en WPF?
- 6. ¿Cuál es la diferencia entre python activo y python?
- 7. ¿Cuál es la diferencia entre dict() y {}?
- 8. En Python, ¿cuál es la diferencia entre pasar y devolver
- 9. ¿Cuál es la diferencia exacta entre la propiedad currentTarget y la propiedad de destino en javascript
- 10. ¿Cuál es la diferencia entre un tema y una plantilla?
- 11. ¿Cuál es la diferencia entre una matriz y un objeto?
- 12. ¿Cuál es la diferencia entre un hilo y una fibra?
- 13. ¿Cuál es la diferencia entre una mónada y un cierre?
- 14. ¿Cuál es la diferencia entre un RoutedCommand y una RoutedUICommand?
- 15. ¿Cuál es la diferencia entre un diccionario y una matriz?
- 16. ¿Cuál es la diferencia entre un algoritmo y una función?
- 17. ¿Cuál es la diferencia entre una instancia y un objeto?
- 18. ¿Cuál es la diferencia entre una heurística y un algoritmo?
- 19. ¿Cuál es la diferencia entre un método y una función?
- 20. Twisted (Python): ¿cuál es la diferencia entre cooperate y coiterate?
- 21. Python: ¿Cuál es la diferencia entre __builtin__ y __builtins__?
- 22. ¿Cuál es la diferencia entre pytz y python-dateutil?
- 23. ¿Cuál es la diferencia entre conjuntos y listas en Python?
- 24. ¿Cuál es la diferencia entre listas y tuplas en Python?
- 25. ¿Cuál es la diferencia entre list y list [:] en python?
- 26. ¿Cuál es la diferencia entre django classonlymethod y python classmethod?
- 27. ¿Cuál es la diferencia entre {} y [] en python?
- 28. En Python, ¿cuál es la diferencia entre ".append()" y "+ = []"?
- 29. ¿Cuál es la diferencia entre una propiedad de navegación y una asociación en EF?
- 30. Cuál es la diferencia entre una propiedad del sistema y la variable de entorno
La mejor respuesta de todo el conjunto, no menos importante, ya que brinda buenos detalles concretos sobre cómo Python maneja esto en el back-end. +1. :) –