recherche

Maison  >  Questions et réponses  >  le corps du texte

解析一下下面的python代码?

近日在学习python,看的的廖大的python教程,这里有段代码看不懂
主要是getValueOrDefault()函数 谁给剖析一下?

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def getValue(self, key):
        return getattr(self, key, None)

    def getValueOrDefault(self, key):
        value = getattr(self, key, None)
        if value is None:
            field = self.__mappings__[key]
            if field.default is not None:
                value = field.default() if callable(field.default) else field.default
                logging.debug('using default value for %s: %s' % (key, str(value)))
                setattr(self, key, value)
        return value
PHP中文网PHP中文网2888 Il y a quelques jours373

répondre à tous(2)je répondrai

  • 怪我咯

    怪我咯2017-04-17 17:31:56

    Il semble qu'il s'agisse d'une classe de base de modèle de base de données, qui hérite de dict, on peut donc dire qu'il s'agit d'un dictionnaire. De plus, vous pouvez jeter un œil à __mappings__ dans ModelMetaclass, qui est un mappage de noms d'attributs avec. colonnes. Donc getValueOrDefault est facile à comprendre. Il s'agit d'obtenir la valeur d'un certain attribut. Si l'attribut de l'objet n'a pas reçu de valeur, obtenez la valeur par défaut de sa colonne correspondante. Par exemple, le modèle suivant représente un utilisateur :

    class UserModel(Model):
        name = Column(String, default='kyle')
        age = Column(Int, default=15)
        
    # 假设我们现在有一个 UserModel 的对象
    user = UserModel()
    
    # 以下两种方式是等价的,都是去访问 name 属性,或者说 name 列的值
    # 注意:还没有赋值,所以会 AttributeError
    user.name
    user['name']
    
    # 下面的 getValueOrDefault 则可以返回 name 的默认值 'kyle'
    
    user. getValueOrDefault('name')

    Remarque : le code ci-dessus est similaire au pseudo-code et ne peut pas être exécuté directement. Il n'est utilisé qu'à des fins d'explication auxiliaire.

    répondre
    0
  • PHPz

    PHPz2017-04-17 17:31:56

    class Model(dict, metaclass=ModelMetaclass):
        # 初始化, 没啥好说的
        def __init__(self, **kw):
            super(Model, self).__init__(**kw)
        # 如果取不到值, 报错, 这是一个魔术方法, 使用时直接getattr(obj, key)
        def __getattr__(self, key):
            try:
                return self[key]
            except KeyError:
                raise AttributeError(r"'Model' object has no attribute '%s'" % key)
        # 同魔术方法, 设置一个值, 使用时setattr(obj, key, val)
        def __setattr__(self, key, value):
            self[key] = value
        # 类方法, 获取一个值
        def getValue(self, key):
            return getattr(self, key, None)
        # 类方法, 获取一个值或其默认值
        def getValueOrDefault(self, key):
            value = getattr(self, key, None)
            if value is None:
                field = self.__mappings__[key]
                if field.default is not None:
                    value = field.default() if callable(field.default) else field.default
                    logging.debug('using default value for %s: %s' % (key, str(value)))
                    setattr(self, key, value)
            return value

    Si les deux premières méthodes magiques ne sont pas définies, les deux méthodes de classe suivantes ne fonctionneront pas

    répondre
    0
  • Annulerrépondre