Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

klasy - przeladownie metody init #11

Open
aturant opened this issue Dec 3, 2018 · 3 comments
Open

klasy - przeladownie metody init #11

aturant opened this issue Dec 3, 2018 · 3 comments

Comments

@aturant
Copy link

aturant commented Dec 3, 2018

Zalozmy, ze nie znamy metody striptime i chcemy napisac klase dziedziczaca po datetime, z initem bioracym napisy postaci '2016-01-01T03:31:58', Jak to zrobic?
proba ponizszej postaci nie dziala.
`from datetime import datetime

class datetimePro(datetime):
def init(self,inStr):
print(inStr)
datetime.init(self,
year =int(inStr[0:4]),
month =int(inStr[5:7]),
day =int(inStr[8:10]),
hour =int(inStr[11:13]),
minute =int(inStr[14:16]),
second =int(inStr[17:19]))

print(datetimePro('2016-01-01T03:31:58','%Y-%m-%dT%H:%M:%S'))`

@FHoffmannCode
Copy link

FHoffmannCode commented Dec 3, 2018

możesz spróbować zrobić def __init__, a potem zamiast datetime.__init__() dać super() - https://docs.python.org/3/library/functions.html#super

z tym, że szczerze mówiąc nie jestem pewien czy to jest dobry pomysł tak sobie dziedziczyć po klasach z biblioteki standardowej (które w dodatku są 'kompletne' i nie ma za bardzo potrzeby ich rozszerzać).

nie wygodniej byłoby napisać funkcję datetime_from_string, w której parsujesz stringa, tworzysz obiekt datetime i go zwracasz?

@aturant
Copy link
Author

aturant commented Dec 3, 2018

`from datetime import datetime

class datetimePro(datetime):
def init(self,inptStr):
print(inptStr)
super().init(
year =int(inptStr[0:4]),
month =int(inptStr[5:7]),
day =int(inptStr[8:10]),
hour =int(inptStr[11:13]),
minute =int(inptStr[14:16]),
second =int(inptStr[17:19]))
datetimePro('2016-01-01T03:31:58')`
probowalem z uzyciem super, ale nie ogarniam jak to zrobic, zeby dzialalo.

Oczywiscie, masz racje.
Nie mialo to byc ani wygodne, ani sensowne, a edukacyjne ;)

@FHoffmannCode
Copy link

FHoffmannCode commented Dec 4, 2018

źle używasz metody super, Twój kod powinien wyglądać mniej więcej tak:

class datetimePro(datetime):
    def __init__(self, inptStr):
        print(inptStr)
        super(
            year =int(inptStr[0:4]),
            month =int(inptStr[5:7]),
            day =int(inptStr[8:10]),
            hour =int(inptStr[11:13]),
            minute =int(inptStr[14:16]),
            second =int(inptStr[17:19]))
        )

my_datetime_pro = datetimePro('2016-01-01T03:31:58')

problem w tym, że to i tak nie będzie działać - tutaj wyjaśnienie dlaczego - https://stackoverflow.com/questions/399022/why-cant-i-subclass-datetime-date

Sedno problemu tkwi w tym, że obiekty typu datetime są niemutowalne i nie inicjuje się ich za pomocą metody __init__, jeśli faktycznie bardzo chcesz to musisz użyć metody __new__ z tym, że szczerze mówiąc nie polecam, to nie jest coś czym warto się zajmować na początku przygody z pythonem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants