首页 > 解决方案 > 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()

对于这个问题的一个不太抽象的例子,考虑 中的FormMixindjango.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_classself的属性,但这不和calling一模一样self.form_class吗?

标签: pythondjangopython-3.x

解决方案


使用函数可以很容易地让不同的类具有相同的接口,但实现不同。一些实现可能将值存储在属性中,而其他实现则必须计算它。

一个经典的演示是使用笛卡尔坐标或极坐标表示向量的两个类。通过使用方法访问坐标,您可以交换它们。

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

推荐阅读