python - Python 调用“self.property”和创建返回“self.property”的方法有什么区别?
问题描述
假设我有这样的课程:
class SomeClass:
some_property = 'property'
def get_some_property(self):
return self.some_property
def some_method(self):
pass
var1
以下之间和之间有什么区别(如果有)var2
:
def some_method(self):
var1 = self.some_property
var2 = self.get_some_property()
对于这个问题的一个不太抽象的例子,考虑 中的FormMixin
类django.generic.views.edit
,它看起来像这样:
class FormMixin(ContextMixin):
"""Provide a way to show and handle a form in a request."""
initial = {}
form_class = None
success_url = None
prefix = None
...
def get_form_class(self):
"""Return the form class to use."""
return self.form_class
def get_form(self, form_class=None):
"""Return an instance of the form to be used in this view."""
if form_class is None:
form_class = self.get_form_class()
return form_class(**self.get_form_kwargs())
方法get_form_class
返回form_class
self的属性,但这不和calling一模一样self.form_class
吗?
解决方案
使用函数可以很容易地让不同的类具有相同的接口,但实现不同。一些实现可能将值存储在属性中,而其他实现则必须计算它。
一个经典的演示是使用笛卡尔坐标或极坐标表示向量的两个类。通过使用方法访问坐标,您可以交换它们。
import math
class cartesian_vector():
def __init__(self, x, y):
self.x = x
self.y = y
def getX(self):
return self.x
def getY(self):
return self.y
def getR(self):
return math.sqrt(self.x**2 + self.y**2)
def getTheta(self):
return math.atan(self.y/self.x)
class polar_vector():
def __init__(self, r, theta):
self.r = f
self.theta = theta
def getX(self):
return self.r * math.cos(self.theta)
def getY(self):
return self.r * math.sin(self.theta)
def getR(self):
return self.r
def getTheta(self):
return self.theta
推荐阅读
- c# - 如何在 selenium c# 中创建自定义显式等待函数,传入 WebElements 而不是 By
- excel - 将PDF转换为excel数据
- opencv - 如何在opencv中比较两个不同尺度的图像?
- javascript - 为什么这个 React 组件会渲染 4 次?
- html - 如何在markdown中编写给定的html?
- python - aiohttp/asyncio 无异常运行序列结果
- python - 根据相反的条件过滤熊猫数据框是否在列中为真/假
- deep-learning - 如何知道 id embedding 训练好还是坏
- python - 在两个用户的网页之间进行通信
- javascript - JS中如何拖拽图片