Home > Enterprise >  Classes, self, input variables in self and self default values
Classes, self, input variables in self and self default values

Time:02-22

I wrote variables in init's brackets, which should be default if I don’t enter anything, but I get an error if I don’t enter anything and python don’t see the default values ​​​​for the variables. I am using there input to understand the user what to enter and I would like to leave it.

class News:
    def __init__(self, content='Test NEWS name', city='None', news_date_and_time='Not defined'): 
        self.content = str(input('Write down news content:'))
        self.city = str(input('Write down news CITY:'))
        self.news_date_and_time = datetime.now().strftime("%d/%m/%Y %H:%M")
pub = News()

I can achieve the input by passing it to the function, as I wrote below, but I want the function use an input and default values ​​which are written

class News:
    def __init__(self, content='Test NEWS name', city='None', news_date_and_time='Not defined'):  
        self.content = content
        self.city = city
        self.news_date_and_time = datetime.now().strftime("%d/%m/%Y %H:%M")

pub = News('dog ate potatoes','New York')
pub = News(str(input('Input the content:')), str(input('Input the city:')))

How can I implement in the function an input of the variables and the default values ​​are which are written in the function if the wasn't written anything?

CodePudding user response:

but I want the function use an input and default values ​​which are written

This violates the Single Responsibility Principle. Typically we design classes to take arguments similar to how you show in the second code example. This allows the flexibility of reuse because the class doesn't care where the value comes from. In your current situation, you get the values from user input, but you can easily create News objects from database values instead, for example.

To implement default values, I suggest building a separate class or function that decides whether to get input or to use default values. This will make your code in line with the Seperation of Concerns principle.

CodePudding user response:

This function will work the way you want it to work if you test the value of input() and assign the parameter if it's empty:

class News:
    def __init__(self, content='Test NEWS name', city='None', news_date_and_time='Not defined'): 
        self.content = input('Write down news content:') or content
        self.city = input('Write down news CITY:') or city
        self.news_date_and_time = datetime.now().strftime("%d/%m/%Y %H:%M")

As noted, though, this is bad design, because now it's impossible to create a News object without having it stop your script to ask for input. You should instead do this outside of the constructor:

class News:
    def __init__(self, content, city): 
        self.content = content
        self.city = city
        self.news_date_and_time = datetime.now().strftime("%d/%m/%Y %H:%M")

pub1 = News("Dog ate potatoes", "New York")
pub2 = News(input("Enter content: "), input("Enter city: "))

Note that there's no reason to have a news_date_and_time parameter since you always use datetime.now in your constructor.

  • Related