К чему 'сам' относится в @classmethod?

Когда я включил библиотеку программного обеспечения, написанную на C, в существующий демонстрационный проект (использовала библиотеку c ++ mbed), я столкнулся с этой проблемой. Демо-проект будет компилироваться просто отлично, но после того, как я заменил существующий основной файл самостоятельно, произошла эта ошибка.

В этот момент я еще не думал о том, что библиотека mbed, в которой я нуждалась, была написана на C ++. Мой собственный основной файл был .c файлом, который #include mbed заголовочный файл. В результате я использовал свой обычный источник C, как если бы это был источник C ++. Поэтому компилятором, который использовался для компиляции моего основного файла, был компилятор C . Этот компилятор C тогда столкнулся с #include модуля , который на самом деле не существует (в пределах его области), поскольку он не является компилятором C ++.

Только после того, как я проверил вывод из журнала построения я понял, что различные исходные файлы C и C ++ были скомпилированы более чем одним компилятором (компилятором c ++). В проекте использовались компиляторы arm-none-eabi-c ++ и arm-none-eabi-gcc (для встроенных систем), как показано ниже.

Журнал компиляции:

Building file: ../anyfile.cpp
Invoking: MCU C++ Compiler
arm-none-eabi-c++  "../anyfile.cpp"
Finished building: ../anyfile.cpp

Building file: ../main.c
Invoking: MCU C Compiler
arm-none-eabi-gcc  "../main.c"
In file included from \mbed/mbed.h:21:0,
                 from ../main.c:16:
\mbed/platform.h:25:19: fatal error: cstddef: No such file or directory
compilation terminated.

Конечно, в среде C ++ cstddef существует , но в среде C cstddef не существует, вместо этого это просто реализация C stddef .

Другими словами, cstddef не существует в компиляторе C. Я решил эту проблему, переименовав свой файл main.c в main.cpp, а остальная часть кода тоже была скомпилирована.

TLDR / Заключение: при создании проекта на C ++ избегайте смешивания файлов C с файлами на C ++ ( источники и заголовки). Если возможно, переименуйте файлы .c в файлы .cpp, чтобы использовать компилятор C ++ вместо компилятора C. Там, где это необходимо.

19
задан Yes - that Jake. 10 February 2009 в 17:18
поделиться

3 ответа

сам класс :

метод класса А получает класс как неявный первый аргумент, точно так же, как метод экземпляра получает экземпляр.

class C:
    @classmethod
    def f(cls):
        print(cls.__name__, type(cls))

>>> C.f()
C <class 'type'>

и это cls канонически, btw

36
ответ дан 30 November 2019 в 02:39
поделиться

Первый параметр classmethod называют cls условно и относится к объект класса , на который метод он был вызван .

>>> class A(object):
...     @classmethod
...     def m(cls):
...         print cls is A
...         print issubclass(cls, A)

>>> class B(A): pass
>>> a = A()
>>> a.m()
True
True
>>> b = B()
>>> b.m()
False 
True
14
ответ дан 30 November 2019 в 02:39
поделиться

Объект класса передается как первый параметр. Например:

class Foo(object):
    @classmethod
    def bar(self):
        return self()

возвратил бы экземпляр класса Foo.

РЕДАКТИРОВАНИЕ :

Примечание, что последняя строка была бы сам () не сам. сам возвратил бы сам класс, в то время как сам () возвращает экземпляр.

0
ответ дан 30 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: