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
答案 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)
self
和instance
都不是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