python: могу ли я использовать оператор форматирования строки с методами получения класса? - PullRequest
1 голос
/ 15 июля 2011

Я хочу сделать что-то вроде этого:

class Foo(object):
    def __init__(self, name):
        self._name = name
        self._count = 0
    def getName(self):
        return self._name
    name = property(getName)
    def getCount(self):
        c = self._count
        self._count += 1
        return c
    count = property(getCount)
    def __repr__(self):
        return "Foo %(name)s count=%(count)d" % self.__dict__

, но это не работает, потому что name и count - свойства с геттерами.

Есть ли способисправить это, чтобы я мог использовать строку формата с именованными аргументами, чтобы вызывать геттеры?

1 Ответ

2 голосов
/ 15 июля 2011

Просто измените его, чтобы не использовать self.__dict__. Вы должны обращаться к name и count как к свойствам, а не пытаться обращаться к ним по именам, с которыми связаны их свойства:

class Foo(object):
    def __init__(self, name):
        self._name = name
        self._count = 0
    def getName(self):
        return self._name
    name = property(getName)
    def getCount(self):
        c = self._count
        self._count += 1
        return c
    count = property(getCount)
    def __repr__(self):
        return "Foo %s count=%d" % (self.name, self.count)

Затем используется:

>>> f = Foo("name")
>>> repr(f)
'Foo name count=0'
>>> repr(f)
'Foo name count=1'
>>> repr(f)
'Foo name count=2'

РЕДАКТИРОВАТЬ : Вы по-прежнему можете использовать именованное форматирование, но вы должны изменить свой подход, поскольку вы не можете получить доступ к свойствам через нужные имена:

def __repr__(self):
    return "Foo %(name)s count=%(count)d" % {'name': self.name, 'count': self.count}

Это может быть лучше, если вы повторяете что-то и / или имеете много вещей, но это немного глупо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...