Необходимо ли сделать 50 разных классов для каждого штата в США? - PullRequest
0 голосов
/ 06 января 2019

Я работаю над простым генератором, который выплевывает 1 случайное состояние в США. За ним следуют город и почтовый индекс из этого штата. Я хочу, чтобы у моего RNG было по крайней мере 10 городов на выбор. коды из этого города) Мне действительно нужно сделать 50 различных классов для каждого штата и обеспечить 10 методов для каждого класса? Каждый метод просто выводит текст пользователю. Ничего особенного. Но я чувствую, что здесь что-то не так. Я знаю, что есть более простой способ сделать это с меньшим количеством строк кода. Я ошибся? Пожалуйста, посмотрите на часть моего кода, если вы запутались.

Как я могу получить только 1 вывод из 50 разных классов? Могу ли я создать массив всех классов, затем выполнить random.choice() Я не хочу писать тонну кода без причины, поэтому я предоставил Newyork класс только с 3 методами. Но давайте представим, что у меня 50 таких классов с 10 методами

import tkinter as tk
import random


class Newyork:

def bronx(self):
    bronx_zips = [10453, 10457, 10460, 10451, 10474]
    random_bronx_zips = random.choice(bronx_zips)
    new_bronx_zip = "Bronx NY,", random_bronx_zips
    return new_bronx_zip

def albany(self):
    albany_zips = [12084, 12201, 12202, 12203, 12204]
    random_albany_zips = random.choice(albany_zips)
    new_albany_zip = 'Albany NY,', random_albany_zips
    return new_albany_zip

def buffalo(self):
    buffalo_zips = [14201,14202, 14203, 14204, 14205]
    random_buffalo_zip = random.choice(buffalo_zips)
    new_buffalo_zip = 'Buffalo NY', random_buffalo_zip
    return new_buffalo_zip

newyork = Newyork()

def random_NY_output():
   NY_methods = [newyork.bronx(), newyork.albany(),newyork.buffalo()]
   random_ny_output = random.choice(NY_methods)
   return random_ny_output

def update_entry():
    locationstate_entry.delete(0, tk.END)
    locationstate_entry.insert(0, random_NY_output())

button = tk.Button(root, text="Generate", command=update_entry, activebackground="blue")

Как видите, функция random_NY_output() просто выплевывает все, что мне нужно знать о классе newyork. Это дает мне 1 случайный вывод. Но, как я уже сказал, мне нужен только ОДИН выход из 50 различных классов. Как это можно сделать?

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Насколько я могу судить по вашему опубликованному примеру кода, ваше требование состоит в том, чтобы повторно предоставлять случайный набор ("City ST", zip) из заранее определенного набора таких значений.

Для этого даже не нужен ни один класс, так как он не делает никаких классных вещей. (Вот бонусное видео о том, как не писать классы: Прекратить писать классы .)

Просто составьте большой список кортежей и используйте random.choice (или .shuffle, если это имеет больше смысла для вашего общего приложения), чтобы выполнить работу:

_places = []
_places.extend((("Albany NY", zip) for zip in (12084, 12201, 12202, 12203, 12204))
_places.extend((("Bronx NY", zip) for zip in (10453, 10457, 10460, 10451, 10474))
_places.extend((("Buffalo NY", zip) for zip in (14201,14202, 14203, 14204, 14205))
# Many, many lines omitted...

def random_place():
    return random.choice(_places)

def update_entry():
    locationstate_entry.delete(0, tk.END)
    locationstate_entry.insert(0, random_place())
0 голосов
/ 06 января 2019

Вместо использования разных классов для каждого состояния создайте словарь, содержащий всю вашу информацию. Затем вы можете сгенерировать свои строки на основе этого, а также без жесткого кода.

>>> import random
>>> states = {
...   'NY': {
...     'Albany': [12084, 12201, 12202, 12203, 12204],
...     'Bronx': [10453, 10457, 10460, 10451, 10474],
...     'Buffalo': [14201,14202, 14203, 14204, 14205]
...   }
... }
>>> state = random.choice(list(states.keys()))
>>> state
'NY'
>>> cities = states[state]
>>> cities
{'Albany': [12084, 12201, 12202, 12203, 12204], 'Bronx': [10453, 10457, 10460, 10451, 10474], 'Buffalo': [14201, 14202, 14203, 14204, 14205]}
>>> city = random.choice(list(cities.keys()))
>>> city
'Bronx'
>>> zips = cities[city]
>>> zips
[10453, 10457, 10460, 10451, 10474]
>>> zip_code = random.choice(zips)
>>> zip_code
10460
>>> city, state, zip_code
('Bronx', 'NY', 10460)

Если бы это был мой код, я бы написал для этого функцию (с вспомогательной функцией):

>>> def choose_from(dictionary):
...     key = random.choice(list(dictionary.keys()))
...     return key, dictionary[key]
... 
>>> def random_city_state_zip():
...     state, cities = choose_from(states)
...     city, zip_codes = choose_from(cities)
...     zip_code = random.choice(zip_codes)
...     return state, city, zip_code
... 
>>> random_city_state_zip()
('NY', 'Albany', 12203)
>>> random_city_state_zip()
('NY', 'Bronx', 10457)
0 голосов
/ 06 января 2019

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

Вы можете создать один класс, который принимает аргументы, которые определяют уникальные для состояния вещи, такие как имя и аббревиатура. Города могут быть атрибутом состояния, которые добавляются до, после или во время создания государства.

Например:

new_york = State("New York", "NY")
new_york.add_city("Albany", zips=[12084, 12201, 12202, 12203, 12204])
new_york.add_city("Bronx", [0453, 10457, 10460, 10451, 10474])

или это:

albany = City("Albany", zips=[12084, 12201, 12202, 12203, 12204])
bronx = City("Bronx", zips=[0453, 10457, 10460, 10451, 10474])
new_york = State("New York", "NY", cities=[albany, bronx])

или объедините их с этим:

new_york = State("New York", "NY", cities = [
    City("Albany", zips=[12084, 12201, 12202, 12203, 12204]),
    City("Bronx", zips=[0453, 10457, 10460, 10451, 10474]),
])

Затем вы можете добавить свои методы случайного выбора общим способом, потому что они просто должны извлечь из self.zips для города или self.cities для штата. Или вы можете выполнять итерации по каждому штату и / или по каждому городу в этом штате. Это все довольно просто и зависит только от того, что вам нужно сделать.

Суть в том, чтобы создать универсальные классы штата и / или города и универсальные методы, которые выбирают из уникальных данных для каждого экземпляра.

0 голосов
/ 06 января 2019

Вместо написания классов используйте словари:

zips = {
    'NY': {
        "Bronx NY":[10453, 10457, 10460, 10451, 10474],
        'Albany NY': [12084, 12201, 12202, 12203, 12204],
        'Buffalo NY': [14201,14202, 14203, 14204, 14205],
    },
}
location = random.choice(list(zips['NY'].keys()))
zip = random.choice(zips['NY'][location])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...