Python IsInstance() 用于类和子类



这段代码来自python烹饪书第3版,来自class章节8.13节。该程序尝试定义各种数据结构,但希望对允许分配给某些属性的值强制实施约束。 我正在使用Pycharm IDE在python 2.7中执行该程序。

# Base class. Uses a descriptor to set a value
class Descriptor(object):
def __init__(self, name=None, **opts):
self.name = name
for key, value in opts.items():
setattr(self, key, value)
def __set__(self, instance, value):
instance.__dict__[self.name] = value
# Descriptor for enforcing types
class Typed(Descriptor):
expected_type = type(None)
def __set__(self, instance, value):
if not isinstance(value, self.expected_type):
raise TypeError('expected ' + str(self.expected_type))
super(Typed,self).__set__(instance, value)
class Integer(Typed):
expected_type = int
class String(Typed):
expected_type = str
class MaxSized(Descriptor):
def __init__(self, name=None, **opts):
if 'size' not in opts:
raise TypeError('missing size option')
super(MaxSized,self).__init__(name, **opts)
def __set__(self, instance, value):
if len(value) >= self.size:
raise ValueError('size must be < ' + str(self.size))
super(MaxSized,self).__set__(instance, value)

class SizedString(String, MaxSized):
pass
# Class decorator to apply constraints
def check_attributes(**kwargs):
def decorate(cls):
for key, value in kwargs.items():
if isinstance(value, Descriptor):
value.name = key
setattr(cls, key, value)
else:
setattr(cls, key, value(key))
return cls
return decorate
# Example
@check_attributes(name=String,shares=Integer,place=SizedString('tester',size=8))
class Stock(object):
def __init__(self, stkname, stkqty,stkhq):
self.name = stkname
self.shares = stkqty
self.place = stkhq

当执行具有以下初始化的代码时,

s = Stock('ACME', 50,'hky')
print s.name # print ACME
print s.shares # prints 50
print s.place # prints hky

条件:

当调试以下代码时@check_attributesplace=SizedString('tester',size=8),下面的if条件为 True,而name=String 和 shares=Integer,else 条件为 True。

if isinstance(value, Descriptor):
value.name = key
setattr(cls, key, value)
else:
setattr(cls, key, value(key))

问题:

  1. 如果 SizedString 是描述符的实例(基于继承层次结构 - 字符串、类型、MaxSized、描述符),那么字符串和整数也应该满足 If 条件对吗? 因为最后它也是 (类型化, 描述符) 的子类?

      setattr(cls, key, value(key))中的value(key)是什么意思
    1. ,不明白什么是value(key)是什么意思?

很抱歉上下文冗长,但希望尽可能清楚.

  1. 如果 SizedString 是 Descriptor 的实例(基于 Inheritance hierarchy- String , Typed , MaxSized, Descriptor),那么 String 和 Integer 也应该满足 If 条件对吗? 因为最后它也是 (类型化, 描述符) 的子类?

    我们必须仔细查看传递给check_attributes函数的内容。仔细看看nameshare关键字参数的值是什么:

    @check_attributes(name=String,shares=Integer,place=SizedString('tester',size=8))
    

    注意到StringInteger类名后面缺少括号了吗?这意味着StringInteger类对象本身被传递到check_attributes,而不是任何一个类的实例。由于String类对象和Integer类对象不是Descriptor的子类,isinstance(value, Descriptor)失败。

  2. setattr(cls, key, value(key))中的value(key)
  3. 是什么意思,不明白什么是value(key)是什么意思?

    想想吧。由于value具有传递给check_attributes的任何关键字参数的值,并且该值不是Descriptor类的实例,因此value必须引用类对象。(如果你不明白为什么会这样,请参考我对你第一个问题的回答)。因此,调用value(key)是创建某个类的实例,并将key值作为构造函数参数传入。

相关内容

  • 没有找到相关文章

最新更新