作为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)
Run Code Online (Sandbox Code Playgroud)
现在在我的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])
Run Code Online (Sandbox Code Playgroud)
我不知道你可以在一个属性中使用lambda.现在从我的理解是它设置了profile作为lambda的getter并且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 ?
Run Code Online (Sandbox Code Playgroud)
现在在我的情况下如何将参数传递给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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,与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)
Run Code Online (Sandbox Code Playgroud)
而不是传递函数名称,property我们可以改为使用lambdas:
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)
Run Code Online (Sandbox Code Playgroud)
我们不能将setter作为lambda传递,因为lambdas不能包含赋值.这里我继续使用self作为参数名称,但我可以使用任何变量名称,例如:
foo = property(lambda u: u._foo, foo_set)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |