статический метод и __init__ в OOP - PullRequest
0 голосов
/ 08 апреля 2020

Доброе утро, я прохожу книгу Дасти Филлипса - Python 3 Объектно-ориентированное программирование. Есть пример класса

class Property:
    def __init__(self, square_feet='', beds='', baths='', **kwargs):
        super().__init__(**kwargs)
        self.square_feet = square_feet
        self.num_beds = beds
        self.num_baths = baths

    def display(self):
        print("PROPERTY DETAILS")
        print(f'square footage: {self.square_feet}')
        print(f'bedrooms: {self.num_beds}')
        print(f'baths: {self.num_baths}')
        print()
    @staticmethod
    def prompt_init():
        return dict(square_feet=input("Enter the square feet: "),beds=input("Enter number of bedrooms: "),baths=input("Enter number of baths: "))

и информация о том, что prompt_init - "Этот метод использует конструктор dict Python для создания словаря значений, которые можно передать в init . Значение для каждой клавиши запрашивается с помощью ввода. " Вопрос в том, как метод prompt_init как staticmethod может передавать переменные в init ? Я совершенно не понимаю, что именно происходит и как это может работать так. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Как написано, вы несете ответственность за передачу полученного dict на __init__:

 args = Property.prompt_init()
 p = Property(**args)

Метод класса, который может сделать это для вас, будет более уместным:

class Property:
    def __init__(...):
        ...  # As before

    @classmethod
    def from_user_input(cls):
        square_feet = input("Enter the square feet: ")
        beds = input("Enter number of bedrooms: ")
        baths = input("Enter number of baths: ")
        return cls(square_feet, beds, baths)

p = Property.from_user_input()
0 голосов
/ 08 апреля 2020

Метод prompt_init() stati c не создает экземпляр какого-либо свойства, просто запрашивает у пользователя вводные данные и возвращает словарь атрибутов, которые можно использовать для создания экземпляров.

В качестве примера :

class Property:
    def __init__(self, square_feet='', beds='', baths='', **kwargs):
        super().__init__(**kwargs)
        self.square_feet = square_feet
        self.num_beds = beds
        self.num_baths = baths

    def display(self):
        print("PROPERTY DETAILS")
        print(f'square footage: {self.square_feet}')
        print(f'bedrooms: {self.num_beds}')
        print(f'baths: {self.num_baths}')
        print()

    @staticmethod
    def prompt_init():
        return dict(square_feet=input("Enter the square feet: "),beds=input("Enter number of bedrooms: "),baths=input("Enter number of baths: "))

inputs = Property.prompt_init()
new_property = Property(**inputs)

Вы также можете определить фабричный метод stati c, чтобы упростить это:

class Property:
    ...

    @staticmethod
    def create_property():
        return Property(**Property.prompt_init())

new_property = Property.create_property()

или еще лучше, как метод класса:

class Property:
    ...

    @classmethod
    def create_property(cls):
        return cls(**cls.prompt_init())

new_property = Property.create_property()

В любом случае вам все равно придется вызвать конструктор класса для создания экземпляра, поскольку prompt_init() этого не делает.

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