gpt4 book ai didi

Python - Property Getter 作为带有参数的 lambda

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:15 26 4
gpt4 key购买 nike

作为 python 的新手,我刚刚遇到 property 关键字,它基本上可以让您分配 getter 和 setter。我想到了这个简单的例子

class foo:
def __init__(self,var=2):
self.var= var

def setValue(self,var):
print("Setting value called")
self._var = var

def getValue(self):
print("getting value")

var = property(getValue,setValue)

现在在我的 django 项目中我遇到了这样的事情(在属性中使用 lambda)

class UserProfile(models.Model):
user = models.OneToOneField(User)
likes_cheese = models.BooleanField(default=True)
puppy_name = models.CharField(max_length=20)

User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0])

我不知道您可以在属性中使用 lambda。现在据我了解,它将 profile 的 getter 设置为 lambda,并且 getter 需要一个参数。这让我很困惑。所以我决定尝试我自己的例子

class double:
def setValue(self,var):
print("Setting value called")
self._var = var

def getValue(self):
print("getting value")

#var = property(getValue,setValue)
var = property(lambda x: print("The value of parameter is" + str(x)))

d =double()
d.var #Call the getter but how do i pass a value parameter to it ?

现在在我的例子中,我如何将参数传递给 lambda?

最佳答案

编写属性的正常/惯用方式是:

class MyClass(object):
def __init__(self):
self._foo = 42

@property
def foo(self):
return self._foo

@foo.setter
def foo(self, val):
self._foo = val

如您所见,与 Python 中的所有其他方法定义一样,该方法的第一个参数是 self

您可以随意命名参数(不要!),但第一个参数始终是对象本身。

上面的漂亮语法可以解构为

class MyClass(object):
def __init__(self):
self._foo = 42

def foo_get(self):
return self._foo

def foo_set(self, val):
self._foo = val

foo = property(foo_get, foo_set)

我们可以使用 lambdas 而不是将函数 names 传递给 property:

class MyClass(object):
def __init__(self):
self._foo = 42

def foo_set(self, val):
self._foo = val

foo = property(lambda self: self._foo, foo_set)

我们不能将 setter 作为 lambda 传递,因为 lambda 不能包含赋值。在这里,我继续使用 self 作为参数名称,但我可以使用任何变量名称,例如:

foo = property(lambda u: u._foo, foo_set)

关于Python - Property Getter 作为带有参数的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com