Я немного поиграл с super()
и узнал, что мы можем изменить порядок вызова.
Например, у нас есть следующая структура иерархии:
A
/ \
B C
\ /
D
In этот случай MRO of D будет (только для Python 3):
In [26]: D.__mro__
Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
Давайте создадим класс, где super()
вызывает после выполнения метода.
In [23]: class A(object): # or with Python 3 can define class A:
...: def __init__(self):
...: print("I'm from A")
...:
...: class B(A):
...: def __init__(self):
...: print("I'm from B")
...: super().__init__()
...:
...: class C(A):
...: def __init__(self):
...: print("I'm from C")
...: super().__init__()
...:
...: class D(B, C):
...: def __init__(self):
...: print("I'm from D")
...: super().__init__()
...: d = D()
...:
I'm from D
I'm from B
I'm from C
I'm from A
A
/ ⇖
B ⇒ C
⇖ /
D
Таким образом, мы можем видеть, что порядок разрешения такой же, как в MRO. Но когда мы назовем super()
в начале метода:
In [21]: class A(object): # or class A:
...: def __init__(self):
...: print("I'm from A")
...:
...: class B(A):
...: def __init__(self):
...: super().__init__() # or super(B, self).__init_()
...: print("I'm from B")
...:
...: class C(A):
...: def __init__(self):
...: super().__init__()
...: print("I'm from C")
...:
...: class D(B, C):
...: def __init__(self):
...: super().__init__()
...: print("I'm from D")
...: d = D()
...:
I'm from A
I'm from C
I'm from B
I'm from D
У нас есть другой порядок, он меняет порядок кортежа MRO.
A
/ ⇘
B ⇐ C
⇘ /
D
Для Дополнительное чтение Я бы рекомендовал следующие ответы:
Взгляните на libcsv , который является библиотекой CSV, написанной в ANSI C89.
Анализ CSV не слишком сложный, зависит от структуры CSV, посмотрите на функцию strtok .
strtok()
не очень просто.
– Jonathan Leffler
2 January 2013 в 02:29
Существует простая библиотека парсеров CSV, описанная в превосходной книге «Практика программирования ] Kernighan и Pike , а источник доступен на сайте, связанном с.