Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django';s@property怎么办?_Python_Django - Fatal编程技术网

Python Django';s@property怎么办?

Python Django';s@property怎么办?,python,django,Python,Django,Django中的@property是什么 以下是我对它的理解:@property是类中方法的装饰器,用于获取方法中的值 但是,据我所知,我可以像普通方法一样调用该方法,它会得到它。所以我不确定它到底是做什么的 示例来自: 来自django.db导入模型的 班级负责人(models.Model): first_name=models.CharField(最大长度=50) last_name=models.CharField(最大长度=50) 出生日期=models.DateField() def婴

Django中的
@property
是什么

以下是我对它的理解:
@property
是类中方法的装饰器,用于获取方法中的值

但是,据我所知,我可以像普通方法一样调用该方法,它会得到它。所以我不确定它到底是做什么的

示例来自:

来自django.db导入模型的

班级负责人(models.Model):
first_name=models.CharField(最大长度=50)
last_name=models.CharField(最大长度=50)
出生日期=models.DateField()
def婴儿潮一代状态(自我):
“返回该人的婴儿潮一代状态。”
导入日期时间
如果自出生日期<日期时间日期(1945年8月1日):
返回“前婴儿潮”
elif self.birth_date

如果存在与否有什么区别?

如您所见,函数
full\u name
返回一个包含人名和姓氏的字符串

@property
装饰器所做的是声明它可以像普通属性一样被访问

这意味着您可以调用
full\u name
,就像它是一个成员变量而不是一个函数一样,如下所示:

@full_name.setter
def full_name(self, value):
     names = value.split(' ')
     self.first_name = names[0]
     self.last_name = names[1]
person.full_name = 'John Doe'
name=person.full\u name

而不是

person.set_full_name('John Doe')
name=person.full\u name()

您还可以定义如下的setter方法:

@full_name.setter
def full_name(self, value):
     names = value.split(' ')
     self.first_name = names[0]
     self.last_name = names[1]
person.full_name = 'John Doe'
使用此方法,您可以如下设置人员全名:

@full_name.setter
def full_name(self, value):
     names = value.split(' ')
     self.first_name = names[0]
     self.last_name = names[1]
person.full_name = 'John Doe'
而不是

person.set_full_name('John Doe')

另外,上面的setter只是一个例子,因为它只适用于由两个单词组成并用空格分隔的名称。在现实生活中,您应该使用更强大的函数。

在某些语言中,鼓励用户将属性设置为私有,并创建公共getter和setter方法,例如,在一些虚构的类似Python的语言中,使用
private
public

class Foo:
    private bar

    public get_bar(bar):
        return self.bar  # or look it up in a database
                         # or compute it on the fly from other values
                         # or anything else

    public set_bar(new_bar):
        self.bar = new_bar
争论的焦点是提供一个稳定的接口。如果您想更改类的内部工作方式,例如从数据库中查找或计算,则类的用户无需更改任何内容;他们只是不停地叫能手和二传手

在Python中,我们没有真正的私有属性,我们需要简单的语法。所以我们把它翻过来:程序员通常直接访问对象的属性。但是如果你想改变内在行为呢?我们不想更改类的接口

@property
允许您更改
栏的内部工作方式,而无需更改外部接口。该类的用户仍然可以访问
foo.bar
,但您的内部逻辑可能完全不同:

class Foo:
    def __init__(self, bar):
        self.bar = bar

def main():
    f = Foo()
    print(f.bar)

# Later we can change to something like this without breaking other code
class Foo:
    def __init__(self, bar):
        self.save_bar_to_database(bar)  # Or anything else

    @property
    def bar(self):
        return self.load_bar_from_database()

它来自Python;这不是Django的具体问题,我在发布问题之前阅读了该文件。我很难理解它,它没有Django特有的功能,这是Python中的一个装饰程序。