Зависимые значения в экземпляре класса - PullRequest
0 голосов
/ 11 октября 2018

Я новичок в python и застрял с простой проблемой: Вот пример кода:

import random
class shirt:
    def __init__(self, color, size, size_description):
        self.color = color
        self.size = size
        self.size_description = size_description

def randomshirtsize():
    randomshirtsize_ch = (
        's',
        'm',
        'l'
    )
    return random.choice(randomshirtsize_ch)

def randomshirtdescription():
    if randomshirtsize() == 's':
        return 'small'
    elif randomshirtsize() == 'm':
        return 'medium'
    elif randomshirtsize() == 'l':
        return 'large'
    else:
        return 'Error! No valid size found'

shirt1 = shirt('blue', randomshirtsize(), randomshirtdescription())

print('Your shirt is size ' + shirt1.size + '. In other words ' + shirt1.size_description)

Теоретически randomshirtdescription () должен соответствовать выводу randomshirtsize (), но это совершенно случайно,Может кто-нибудь мне помочь?Я также хочу остаться с подходом к моим классам / экземплярам, ​​потому что мой основной код намного больше и зависит от классов и экземпляров.

РЕДАКТИРОВАТЬ: Это новый код с подходом от господина Alihoseiny, но я все ещене могу заставить его работать.

import random
class shirt:
    def __init__(self, color, size):
        self.color = color
        self.size = size
        self.size_description = get_size_description()

    def get_size_description(self):
        if  self.size == 's':
            return 'small'
        elif self.size == 'm':
            return 'medium'
        elif self.size == 'l':
            return 'large'
        else:
            return 'Error! No valid size found'


def randomshirtsize():
    randomshirtsize_ch = (
        's',
        'm',
        'l'
    )
    return random.choice(randomshirtsize_ch)


shirt1 = shirt('blue', randomshirtsize())

print('Your shirt is size ' + shirt1.size + '. In other words ' + shirt1.size_description)  

Когда я запускаю его, я получаю следующую ошибку: NameError: имя 'get_size_description' не определено

1 Ответ

0 голосов
/ 11 октября 2018

randomshirtsize создает случайный вывод при каждом вызове, поэтому, когда вы хотите использовать его в randomshirtdescription, вы должны сохранить его значение в локальной переменной и использовать значение этой переменной в ifзаявления.например:

def randomshirtdescription():
    random_size = randomshirtsize()
    if  random_size == 's':
        return 'small'
    elif random_size == 'm':
        return 'medium'
    elif random_size == 'l':
        return 'large'
    else:
        return 'Error! No valid size found'

Редактировать

Если вы сделаете упомянутое изменение, ваши функции будут работать правильно, но их поведение будет некорректным при использовании с вашим классом.Я думаю, что лучше внести в них изменения.

Я думаю, что лучше изменить функцию randomshirtdescription на функцию, которая возвращает описание данного размера рубашки.Примерно так:

def shirtdescription(shirt_size):
    if  shirt_size == 's':
        return 'small'
    elif shirt_size == 'm':
        return 'medium'
    elif shirt_size == 'l':
        return 'large'
    else:
        return 'Error! No valid size found'

Теперь вы можете получить ожидаемые результаты из своего кода с помощью вызова вашего класса и функций, если выполните следующее:

random_size = randomshirtsize()
shirt1 = shirt('blue', random_size, randomshirtdescription(random_size))

Но, тем не менее, это решение не является объектно-ориентированным.ориентированный.Я думаю, что лучше преобразовать этот новый shirtdescription в метод вашего shirt класса.

Я думаю, что лучший класс будет выглядеть примерно так:

class shirt:

    def __init__(self, color, size):
        self.color = color
        self.size = size
        self.size_description = self.get_size_description()

    def get_size_description(self):
        if  self.size == 's':
            return 'small'
        elif self.size == 'm':
            return 'medium'
        elif self.size == 'l':
            return 'large'
        else:
            return 'Error! No valid size found'
...