В Python как представить класс так же, как это делает названный кортеж? - PullRequest
0 голосов
/ 10 января 2020

Первоначально я написал некоторый код, используя именованный кортеж:

from collections import namedtuple


Count = namedtuple('Count', 'input_number multiple_of count remainder')


def get_count(input_number: int, multiple_of: int) -> Count:
    '''
    >>> get_count(100, 10)
    Count(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> get_count(5, 6)
    Count(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> get_count(999, 90)
    Count(input_number=999, multiple_of=90, count=11, remainder=9)
    '''
    count = input_number // multiple_of
    remainder = input_number % multiple_of
    return Count(
        input_number=input_number,
        multiple_of=multiple_of,
        count=count,
        remainder=remainder
    )

ПРИМЕЧАНИЕ. Как при печати объекта он имеет формат: Count (input_number = 100, multip_of = 10, count = 10, остаток = 0), например.

Существует ли Pythoni c / лучший способ представления обычных классов таким же образом?

I тогда Я хотел включить функции ввода python3 .6 + и обнаружил, что не могу этого сделать с помощью namedtuple из коллекций, поэтому я отредактировал класс Count следующим образом:

from typing import NamedTuple


class Count(NamedTuple):
    input_number: int
    multiple_of: int
    count: int
    remainder: int

Я не совсем я доволен необходимостью двух функций, поэтому я начал с нового:

class GetCount():
    '''
    >>> GetCount(100, 10)
    GetCount(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> GetCount(5, 6)
    GetCount(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> GetCount(999, 90)
    GetCount(input_number=999, multiple_of=90, count=11, remainder=9)
    '''

    def __init__(self, input_number: int, multiple_of: int):
        self.input_number: int = input_number
        self.multiple_of: int = multiple_of
        self.count: int = input_number // multiple_of
        self.remainder: int = input_number % multiple_of

Каков наилучший способ получить результат так, как я ожидаю (см. doctests для ожидаемого результата).

1 Ответ

0 голосов
/ 10 января 2020

Решение проблемы заключается в следующем:

class GetCount():
    '''
    >>> GetCount(100, 10)
    GetCount(input_number=100, multiple_of=10, count=10, remainder=0)
    >>> GetCount(5, 6)
    GetCount(input_number=5, multiple_of=6, count=0, remainder=5)
    >>> GetCount(999, 90)
    GetCount(input_number=999, multiple_of=90, count=11, remainder=9)
    '''

    def __init__(self, input_number: int, multiple_of: int):
        self.input_number: int = input_number
        self.multiple_of: int = multiple_of
        self.count: int = input_number // multiple_of
        self.remainder: int = input_number % multiple_of

    def __repr__(self):
        return f"{self.__class__.__name__}({', '.join([f'{k}={v}' for k, v in self.__dict__.items()])})"

Вы можете увидеть, что предоставленные тесты проходят, выполнив следующее:

import doctest
doctest.testmod(verbose=True)
...