Python - эквивалент Ruby нового метода - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь реализовать в Python следующее:

NAMES = {"fn" => ["James", "John", "John"], "ln" => ["Smith", "Johnson", "Brown"]}

class RandomNameGenerator
  def self.generate
    new.to_s
  end

  def initialize
    @fn = NAMES['fn'].sample
    @ls = NAMES['ln'].sample
  end

  def to_s
    @fn + " " + @ls
  end
end

, который возвращает:

>> RandomNameGenerator.generate
=> "James Smith"
>> RandomNameGenerator.generate
=> "John Johnson"

Мой код до сих пор выглядит так:

import random

NAMES = {"fn": ["James", "John", "John"], "ln": ["Smith", "Johnson", "Brown"]}

class RandomNameGenerator(object):
    @classmethod
    def generate(cls):
        RandomNameGenerator().__str__

    def __init__(self):
        self.fn = random.choice(NAMES["fn"])
        self.ln = random.choice(NAMES["ln"])

    def __str__(self):
       return self.fn + " " + self.ln
>>> RandomNameGenerator.generate()
>>> print(RandomNameGenerator.generate())
None

Я чувствую, что new.to_s Руби отличается от RandomNameGenerator().__str__ Питона.Что я не понимаю?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы ничего не возвращаете в методе генерации.Также код __init__ вызывается, когда вы инициализируете класс, в вашем случае вы этого не делаете.Вы просто вызываете статический метод класса.Чтобы заставить ваш код работать, вы должны создать новый экземпляр RandomNameGenerator в методе generate.

class RandomNameGenerator(object):
    @classmethod
    def generate(cls):
        return cls()

    def __init__(self):
        self.fn = random.choice(NAMES["fn"])
        self.ln = random.choice(NAMES["ln"])

    def __str__(self):
       return self.fn + " " + self.ln
0 голосов
/ 15 февраля 2019

Вы не возвращаетесь из метода generate():

import random

NAMES = {"fn": ["James", "John", "John"], "ln": ["Smith", "Johnson", "Brown"]}

class RandomNameGenerator(object):
    @classmethod
    def generate(cls):
        return str(cls())

    def __init__(self):
        self.fn = random.choice(NAMES["fn"])
        self.ln = random.choice(NAMES["ln"])

    def __str__(self):
       return self.fn + " " + self.ln

for i in range(5):
    print(RandomNameGenerator.generate())

ВЫХОД:

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