python - 设置描述符的默认(初始)值
问题描述
假设我们得到以下代码:
class NonNegative():
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
instance.__dict__[self.name] = value
class Person:
fingerCount = NonNegative()
eyesCount = NonNegative()
def __init__(self, name):
self.name = name
p = Person("name")
print(p.fingerCount) <----- I want a default value printed here, instead of a KeyError
print(p.eyesCount) <----- ------ | | ------
我将如何分别为 fingerCount 和 eyeCount 分配默认(初始)值?
所以我不必这样做:
p = Person("name")
p.fingerCount = 10
p.eyesCount = 2
print(p.fingerCount) # output: 10
print(p.eyesCount) # output: 2
,但可以这样做:
p = Person("name")
print(p.fingerCount) # output: 10
print(p.eyesCount) # output: 2
解决方案
将默认值传递给该__init__
方法,该方法将其保存以供在instance.__dict__[self.name]
尚不存在时使用。
class NonNegative():
def __init__(self, v=0): # You may or may not want a default default value
self.dflt = v
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__.get(self.name, self.dflt)
def __set__(self, instance, value):
instance.__dict__[self.name] = value
class Person:
fingerCount = NonNegative(10)
eyesCount = NonNegative(2)
def __init__(self, name):
self.name = name
如果您愿意,您可以子类NonNegative
化以提供特定于用例的默认值。
class FingerCount(NonNegative):
def __init__(self, v=10):
super().__init__(v)
class EyeCount(NonNegative):
def __init__(self, v=2):
super().__init__(v)
class Person:
fingerCount = FingerCount()
eyecount = EyeCount()
class Cyclops(Person):
eyecount = EyeCount(1)
如果您想要一个属性的每个实例的起始值,请通过其设置器初始化该属性,__init__
就像任何其他属性一样。
class Person:
fingerCount = NonNegative()
eyesCount = NonNegative()
def __init__(self, fcount=10, ecount=2):
self.fingerCount = fcount
self.eyesCount = ecount
推荐阅读
- c++ - 使用程序生成创建磁盘但纹理无法正常工作
- ios - iPhone X/Xs Max AVCaptureVideoPreviewLayer 比例因子和 resizeAspectFill 模式下的坐标
- python - 使用 API v1 和 Python 从 Product Hunt 检索帖子时出现名称或服务错误
- java - Java中的线程(大学实习)
- ios - ios中的lottie动画为零
- angular - Angular Mentions - 保存所选用户的 ID 值
- javascript - 如何否定一组字符而不是单个字符
- c# - C# Reflection - 使用反射从分隔字符串填充类属性
- java - 我想裁剪图像以设置配置文件
- tensorflow - 带有 R 和 Anaconda 的 Tensorflow - 错误“无法导入 PIL.Image。使用 `load_img` 需要 PIL”