Python的自我与实例

时间:2016-09-08 15:25:08

标签: python django

Python 3中的self和instance关键字有什么区别?

我看到像

这样的代码
def update(self, instance, validated_data):
    """
    Update and return an existing `Snippet` instance, given the validated data.
    """
    instance.title = validated_data.get('title', instance.title)
    instance.code = validated_data.get('code', instance.code)
    instance.linenos = validated_data.get('linenos', instance.linenos)
    instance.language = validated_data.get('language', instance.language)
    instance.style = validated_data.get('style', instance.style)
    instance.save()
    return instance

4 个答案:

答案 0 :(得分:1)

该代码段有点短,但//get an array of the IDs of every category to which the product belongs. $categoryIds = $_product->getCategoryIds(); //set CatID to the second element of the array since the first element //is the base category of which all others are children. $_catID = $categoryIds[1]; //load the correct model $_category = Mage::getModel('catalog/category')->load($_catID); //get the level of the current category $level = $_category->getLevel(); //This if statement prevents the function from trying to run on products //which are not assigned to any category. if($_category->getName()){ // we want the second level category, since the first is the base category. // ie if we call the default category 'base' and the product is in category //base->foo->bar->baz we want to return the link to foo. // while current category is deeper than 2 we ask it for it's parent //category until we reach the one we want while ($level > 2){ $parent = $_category->getParentId(); $_category =Mage::getModel('catalog/category')->load($parent); $level = $_category->getLevel(); } //Now we can build the string and echo it out to the page $caturl = $_category->getUrl_key(); $_linkstring = 'http://www.yourwebsite.com/' . $caturl . '.html'; echo 'in category:'; echo '<a href="' . $_linkstring . '" title="'. $_category->getName() .'">'; echo ' '. $_category->getName(); echo '</a>'; } 不是关键字(instance都不是self,这只是惯例。

它是另一个(也许是同一个)类的另一个实例的参数。

答案 1 :(得分:1)

这个问题相当普遍,但让我看看能不能为你阐明一下:

self指的是update所属的类(按惯例,而不是关键字)。该类包含变量和方法,您可以通过调用self

使用self.update(instance, validated_data)关键字(不是保留关键字)来引用这些变量和方法

对于上面的代码段,self指的是该类。 instance可能是指某个model实例&#34;大提示是instance.save()validated_data是一个字典或类对象,其属性为get在保存之前设置并分配instance属性

希望这有帮助

答案 2 :(得分:1)

selfinstance都不是Python中的关键字。约定使用标识符self作为类中实例方法的第一个参数。调用方法的对象实例将作为第一个参数自动传入。

在上面的代码段中,update很可能是某个类的方法,self似乎是传统的第一个参数,如上所述。第二个参数instance只是另一个参数,名称instance在Python中没有任何意义。

答案 3 :(得分:0)

您所指的是Django REST框架中Serializer类的实现,该类在Model对象的帮助下将数据序列化为Json。 此类具有称为“更新”的方法,该方法将代码段模型对象“实例”作为输入,然后使用validated_data更新该对象。就像在“实例”不是Python中的保留关键字之前提到的一样。

序列化器类与Django Form类非常相似,并且在各个字段上包括相似的验证标志,例如required,max_length和default。

为了更清楚地了解我,我正在共享完整的类实现。

class SnippetSerializer(serializers.Serializer):

    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        Update and return an existing `Snippet` instance, given the validated data.
        """
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance