{"id":204871,"date":"2025-05-29T09:49:42","date_gmt":"2025-05-29T01:49:42","guid":{"rendered":"https:\/\/server.hk\/cnblog\/204871\/"},"modified":"2025-05-29T09:49:42","modified_gmt":"2025-05-29T01:49:42","slug":"%e9%9d%a2%e5%90%91-c98-%e7%a8%8b%e5%ba%8f%e5%91%98%e7%9a%84-python-%e4%b8%ad%e7%9a%84-oop-%e6%a6%82%e5%bf%b5","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/204871\/","title":{"rendered":"\u9762\u5411 C++98 \u7a0b\u5e8f\u5458\u7684 Python \u4e2d\u7684 OOP \u6982\u5ff5"},"content":{"rendered":"<p><b><\/b>     <\/p>\n<h1>\u9762\u5411 C++98 \u7a0b\u5e8f\u5458\u7684 Python \u4e2d\u7684 OOP \u6982\u5ff5<\/h1>\n<p>\u672c\u7bc7\u6587\u7ae0\u5411\u5927\u5bb6\u4ecb\u7ecd\u300a\u9762\u5411 C++98 \u7a0b\u5e8f\u5458\u7684 Python \u4e2d\u7684 OOP \u6982\u5ff5\u300b\uff0c\u4e3b\u8981\u5305\u62ec\uff0c\u5177\u6709\u4e00\u5b9a\u7684\u53c2\u8003\u4ef7\u503c\uff0c\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e00\u4e0b\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20241118\/1731911091673addb399c71.jpg\" class=\"aligncenter\"><\/p>\n<p>\u8fd9\u91cc\u4e3a c++98 \u7a0b\u5e8f\u5458\u5168\u9762\u6f14\u793a\u4e86 python \u4e2d\u7684 oop \u6982\u5ff5\uff1a<\/p>\n<pre># privado por conven\u00e7\u00e3o: _underscore_simples\n# \"realmente privado\": __underscore_duplo (name mangling)\n# p\u00fablico: sem underscore\n\nfrom abc import abstractmethod\nclass animal(abc):\n    # em python, vari\u00e1veis declaradas no escopo da classe e n\u00e3o dentro de um\n    # m\u00e9todo espec\u00edfico, s\u00e3o automaticamente compartilhadas por todas inst\u00e2ncias.\n    species_count = 0 # al\u00e9m disso, elas podem ser inicializadas diretamente dentro da classe.\n\n    # construtor\n    def __init__(self, name):\n        # vari\u00e1veis de inst\u00e2ncia\n        self.name = name       # p\u00fablico\n        self._age = 0          # protegido por conven\u00e7\u00e3o\n        self.__id = id(self)   # privado (mas voc\u00ea consegue acessar com name mangling)\n        animal.species_count += 1\n\n    # destrutor\n    def __del__(self):\n        animal.species_count -= 1\n\n    # m\u00e9todo regular\n    @abstractmethod\n    def make_sound(self):\n        pass  # equivalente a um m\u00e9todo abstrato\/virtual (deve ser implementado apenas nas classes filhas)\n\n    # m\u00e9todo est\u00e1tico (n\u00e3o precisa da inst\u00e2ncia para ser utilizado, nem utiliza seus atributos)\n    @staticmethod\n    def get_kingdom():\n        return \"animalia\"\n\n    # m\u00e9todo de classe (recebe a classe como primeiro argumento, pode acessar atributos da classe)\n    @classmethod\n    def get_species_count(cls):\n        return cls.species_count\n\n    # decorador de propriedade (getter)\n    @property\n    def age(self):\n        return self._age\n\n    # decorador de propriedade (setter)\n    @age.setter\n    def age(self, value):\n        if value &gt;= 0:\n            self._age = value\n\n    # m\u00e9todos especiais (sobrecarga de operadores)\n    def __str__(self):                # como tostring() - para string leg\u00edvel\n        return f\"animal named {self.name}\"\n\n    def __repr__(self):               # para debugging\n        return f\"animal(name='{self.name}')\"\n\n    def __eq__(self, other):          # operador de compara\u00e7\u00e3o ==\n        return isinstance(other, animal) and self.name == other.name\n\n    def __len__(self):                # fun\u00e7\u00e3o len()\n        return self._age\n\n    def __getitem__(self, key):       # operador de acesso []\n        if key == 'name':\n            return self.name\n        raise keyerror(key)\n<\/pre>\n<pre>#include &lt;iostream&gt;\n#include &lt;string&gt;\n#include &lt;sstream&gt;\n\nclass animal {\npublic:\n    static int species_count;\n\n    animal(const std::string&amp; name) : name(name), _age(0), __id(++id_counter) { \/\/ construtor\n        ++species_count;\n    }\n\n    ~animal() {    \/\/ destrutor\n        --species_count;\n    }\n\n    virtual void make_sound() = 0; \/\/ m\u00e9todo n\u00e3o implement\u00e1vel na classe base (virtual\/abstrato)\n\n    static std::string get_kingdom() {  \/\/ n\u00e3o existe distin\u00e7\u00e3o entre\n    \/\/  @classmethod e @staticmethod em cpp, apenas static methods.\n        return \"animalia\";\n    }\n\n    \/\/ static methods podem ser utilizados sem instanciar uma classe e t\u00eam\n    \/\/ acesso \u00e0s propriedades est\u00e1ticas da classe:\n    static int get_species_count() {\n        return species_count;\n    }\n\n    \/\/ getter:\n    int get_age() const {\n        return _age;\n    }\n\n    \/\/ setter:\n    void set_age(int age) {\n        if (age &gt;= 0) {\n            _age = age;\n        }\n    }\n\n    \/\/ implementa\u00e7\u00e3o dos m\u00e9todos especiais que vimos em python:\n    std::string to_string() const {\n        return \"animal named \" + name;\n    }\n\n    std::string repr() const {\n        std::ostringstream oss;\n        oss &lt;&lt; \"animal(name='\" &lt;&lt; name &lt;&lt; \"', age=\" &lt;&lt; _age &lt;&lt; \", id=\" &lt;&lt; __id &lt;&lt; \")\";\n        return oss.str();\n    }\n\n    bool operator==(const animal&amp; other) const {\n        return name == other.name;\n    }\n\n    \/\/ sobrecarga do operador []\n    std::string operator[](const std::string&amp; key) const {\n        if (key == \"name\") {\n            return name;\n        }\n        throw std::out_of_range(\"invalid key\");\n    }\n\n    \/\/ m\u00e9todo isinstance\n    template &lt;typename t&gt;\n    bool isinstance() const {\n        return dynamic_cast&lt;const t*&gt;(this) != nullptr;\n    }\n\nprotected:\n    std::string name;\n    int _age;\n\nprivate:\n    int __id;\n    static int id_counter;\n};\n\n\/\/ vari\u00e1veis est\u00e1ticas de classe s\u00e3o compartilhadas por todas as inst\u00e2ncias mas\n\/\/ precisam ser inicializadas separadamente.\nint animal::species_count = 0;\nint animal::id_counter = 0;\n<\/pre>\n<pre>class dog(animal):\n    def __init__(self, name, breed):\n        # chama o construtor da classe pai\n        super().__init__(name)\n        self.breed = breed\n\n    # sobrescreve o m\u00e9todo da classe pai\n    def make_sound(self):\n        return \"woof!\"\n<\/pre>\n<pre>class dog : public animal {\npublic:\n    dog(const std::string&amp; name, const std::string&amp; breed) : animal(name), breed(breed) {}\n\n    void make_sound() override {\n        std::cout &lt;&lt; \"woof!\" &lt;&lt; std::endl;\n    }\n\nprivate:\n    std::string breed;\n};\n<\/pre>\n<pre>class pet:\n    def is_vaccinated(self):\n        return true\n\nclass domesticdog(dog, pet):\n    pass\n<\/pre>\n<pre>class pet {\npublic:\n    bool is_vaccinated() const {\n        return true;\n    }\n};\n\nclass domesticdog : public dog, public pet {\npublic:\n    domesticdog(const std::string&amp; name, const std::string&amp; breed) : dog(name, breed) {}\n};\n<\/pre>\n<pre>from abc import abc, abstractmethod\n\nclass shape(abc):\n    @abstractmethod\n    def area(self):\n        pass\n<\/pre>\n<pre>class shape {\npublic:\n    virtual ~shape() {}\n    virtual double area() const = 0;\n};\n<\/pre>\n<pre>if __name__ == \"__main__\":\n    # cria objetos\n    dog = dog(\"rex\", \"golden retriever\")\n\n    # acessa atributos\n    print(dog.name)          # p\u00fablico\n    print(dog._age)         # protegido (ainda acess\u00edvel)\n    # print(dog.__id)       # isso falhar\u00e1 \n    print(dog._animal__id)  # isso funciona (acessando attribute privado com name mangling)\n\n    # propriedades\n    dog.age = 5             # usa setter automaticamente\n    print(dog.age)          # usa getter automaticamente\n\n    # m\u00e9todos est\u00e1ticos e de classe\n    print(animal.get_kingdom())\n    print(animal.get_species_count())\n\n    # verifica heran\u00e7a\n    print(isinstance(dog, animal))  # true\n    print(issubclass(dog, animal)) # true\n\n    # m\u00e9todos especiais em a\u00e7\u00e3o\n    print(str(dog))        # usa __str__\n    print(repr(dog))       # usa __repr__\n    print(len(dog))        # usa __len__\n    print(dog['name'])     # usa __getitem__\n<\/pre>\n<pre>int main() {\n    \/\/ cria objetos\n    dog dog(\"rex\", \"golden retriever\");\n\n    \/\/ acessa atributos\n    std::cout &lt;&lt; dog.name &lt;&lt; std::endl;          \/\/ p\u00fablico\n    std::cout &lt;&lt; dog.get_age() &lt;&lt; std::endl;     \/\/ protegido (ainda acess\u00edvel)\n    \/\/ std::cout &lt;&lt; dog.__id &lt;&lt; std::endl;       \/\/ isso falhar\u00e1 (privado)\n\n    \/\/ propriedades\n    dog.set_age(5);             \/\/ usa setter\n    std::cout &lt;&lt; dog.get_age() &lt;&lt; std::endl;     \/\/ usa getter\n\n    \/\/ m\u00e9todos est\u00e1ticos e de classe\n    std::cout &lt;&lt; animal::get_kingdom() &lt;&lt; std::endl;\n    std::cout &lt;&lt; animal::get_species_count() &lt;&lt; std::endl;\n\n    \/\/ equivalente aos \"m\u00e9todos especiais\":\n\n    \/\/ verifica heran\u00e7a\n    if (dog.isinstance&lt;animal&gt;()) {\n        std::cout &lt;&lt; \"dog \u00e9 uma inst\u00e2ncia de animal\" &lt;&lt; std::endl;\n    }\n\n    std::cout &lt;&lt; dog.to_string() &lt;&lt; std::endl;   \/\/ usa to_string\n    std::cout &lt;&lt; dog.repr() &lt;&lt; std::endl;        \/\/ usa repr\n    std::cout &lt;&lt; dog[\"name\"] &lt;&lt; std::endl;       \/\/ usa operador []\n}\n<\/pre>\n<ol>\n<li>\u6ca1\u6709\u516c\u5171\/\u79c1\u6709\/\u53d7\u4fdd\u62a4\u7684\u5173\u952e\u5b57\uff08\u4f7f\u7528\u547d\u540d\u7ea6\u5b9a\uff09<\/li>\n<li>\u591a\u91cd\u7ee7\u627f\u4e0d\u540c\uff1a\n<ul>\n<li>python \u4f7f\u7528\u65b9\u6cd5\u89e3\u6790\u987a\u5e8f (mro) \u548c c3 \u7ebf\u6027\u5316<\/li>\n<li>\u4e0d\u9700\u8981\u50cfc++\u90a3\u6837\u7684\u865a\u62df\u7ee7\u627f<\/li>\n<li> super() \u81ea\u52a8\u9075\u5faa mro<\/li>\n<li>python \u4e2d\u57fa\u7c7b\u7684\u987a\u5e8f\u5f88\u91cd\u8981<\/li>\n<li>\u60a8\u53ef\u4ee5\u4f7f\u7528 __mro__ \u68c0\u67e5\u89e3\u6790\u987a\u5e8f <\/li>\n<\/ul>\n<\/li>\n<li>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u6240\u6709\u65b9\u6cd5\u90fd\u662f\u865a\u62df\u7684<\/li>\n<li>\u6307\u9488\/\u5f15\u7528\u4e4b\u95f4\u6ca1\u6709\u533a\u522b<\/li>\n<li>\u4e0d\u9700\u8981\u5185\u5b58\u7ba1\u7406\uff08\u5783\u573e\u6536\u96c6\u5668\uff09<\/li>\n<li>\u52a8\u6001\u7c7b\u578b\u800c\u4e0d\u662f\u9759\u6001\u7c7b\u578b<\/li>\n<li>\u5c5e\u6027\u88c5\u9970\u5668\u800c\u4e0d\u662f getter\/setter \u65b9\u6cd5<\/li>\n<li>\u7279\u6b8a\u65b9\u6cd5\u4f7f\u7528 __name__ \u683c\u5f0f\u800c\u4e0d\u662f\u8fd0\u7b97\u7b26<\/li>\n<p>\u5173\u952e\u5b57 <\/p>\n<li>\u66f4\u591a\u7528\u4e8e\u8fd0\u7b97\u7b26\u91cd\u8f7d\u7684 pythonic \u8bed\u6cd5\uff08\u4f8b\u5982 __eq__ \u4e0e\u8fd0\u7b97\u7b26 ==\uff09<\/li>\n<\/ol>\n<p>\u4f7f\u7528 dir(object) \u67e5\u770b\u5bf9\u8c61\u7684\u6240\u6709\u5c5e\u6027\u548c\u65b9\u6cd5\uff0c\u4f7f\u7528 help(object) \u67e5\u770b\u6587\u6863\u3002<\/p>\n<pre>                              animal\n\n                           .    '    ,\n                             _______\n                        _  .`_|___|_`.  _\n                    pet     \\ \\   \/ \/     workinganimal\n                             \\ ' ' \/\n                              \\ \" \/   \n                               \\.\/\n\n                           domesticdog\n<\/pre>\n<p>\u5f53\u4e00\u4e2a\u7c7b\u7ee7\u627f\u81ea\u4e24\u4e2a\u7c7b\uff0c\u800c\u8fd9\u4e24\u4e2a\u7c7b\u53c8\u7ee7\u627f\u81ea\u4e00\u4e2a\u516c\u5171\u57fa\u7c7b\u65f6\uff0c\u5c31\u4f1a\u53d1\u751f\u94bb\u77f3\u7ee7\u627f\u3002\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4\u51e0\u4e2a\u95ee\u9898\uff1a<\/p>\n<ol>\n<li> <strong>\u6b67\u4e49<\/strong>\uff1a\u516c\u5171\u57fa\u7c7b\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u53ef\u80fd\u4f1a\u53d8\u5f97\u4e0d\u660e\u786e\u3002<\/li>\n<li> <strong>\u6570\u636e\u91cd\u590d<\/strong>\uff1a\u6bcf\u4e2a\u6d3e\u751f\u7c7b\u90fd\u53ef\u4ee5\u62e5\u6709\u81ea\u5df1\u7684\u516c\u5171\u57fa\u7c7b\u6210\u5458\u526f\u672c\uff0c\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u91cd\u590d\u3002<\/li>\n<\/ol>\n<pre>class animal {\npublic:\n    animal() {\n        std::cout &lt;&lt; \"animal constructor\" &lt;&lt; std::endl;\n    }\n    virtual void make_sound() {\n        std::cout &lt;&lt; \"some generic animal sound\" &lt;&lt; std::endl;\n    }\n};\n\nclass pet : public animal {\npublic:\n    pet() : animal() {\n        std::cout &lt;&lt; \"pet constructor\" &lt;&lt; std::endl;\n    }\n    void make_sound() override {\n        std::cout &lt;&lt; \"pet sound\" &lt;&lt; std::endl;\n    }\n};\n\nclass workinganimal : public animal {\npublic:\n    workinganimal() : animal() {\n        std::cout &lt;&lt; \"workinganimal constructor\" &lt;&lt; std::endl;\n    }\n    void make_sound() override {\n        std::cout &lt;&lt; \"working animal sound\" &lt;&lt; std::endl;\n    }\n};\n\nclass domesticdog : public pet, public workinganimal {\npublic:\n    domesticdog() : animal(), pet(), workinganimal() {\n        std::cout &lt;&lt; \"domesticdog constructor\" &lt;&lt; std::endl;\n    }\n    void make_sound() override {\n        pet::make_sound();  \/\/ ou workinganimal::make_sound(), dependendo do comportamento desejado\n    }\n};\n\nint main() {\n    domesticdog dog;\n    dog.make_sound();\n    return 0;\n}\n<\/pre>\n<pre>animal constructor\npet constructor\nworkinganimal constructor\ndomesticdog constructor\npet sound\n<\/pre>\n<p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0cdomesticdog\u7ee7\u627f\u81eapet\u548cworkinganimal\uff0c\u5b83\u4eec\u90fd\u7ee7\u627f\u81eaanimal\u3002\u8fd9\u521b\u9020\u4e86\u4e00\u9897\u4f20\u5bb6\u5b9d\u94bb\u77f3\u3002\u4f7f\u7528\u865a\u62df\u7ee7\u627f\u6765\u907f\u514d\u6570\u636e\u91cd\u590d\u548c\u6b67\u4e49\u3002<\/p>\n<p>python \u4f7f\u7528\u65b9\u6cd5\u89e3\u6790\u987a\u5e8f (mro) \u548c c3 \u7ebf\u6027\u5316\u6765\u81ea\u52a8\u89e3\u51b3\u83f1\u5f62\u7ee7\u627f\u95ee\u9898\u3002 mro \u786e\u5b9a\u5728\u67e5\u627e\u65b9\u6cd5\u6216\u5c5e\u6027\u65f6\u68c0\u67e5\u7c7b\u7684\u987a\u5e8f\u3002<\/p>\n<pre>class animal:\n    def make_sound(self):\n        print(\"some generic animal sound\")\n\nclass pet(animal):\n    def make_sound(self):\n        print(\"pet sound\")\n\nclass workinganimal(animal):\n    def make_sound(self):\n        print(\"working animal sound\")\n\nclass domesticdog(pet, workinganimal):\n    pass\n\ndog = domesticdog()\ndog.make_sound()\n<\/pre>\n<pre>pet sound\n<\/pre>\n<p>\u5728\u6b64\u793a\u4f8b\u4e2d\uff0cpython \u4f7f\u7528 mro \u81ea\u52a8\u89e3\u6790\u83f1\u5f62\u7ee7\u627f\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528 __mro__:<br \/> \u5c5e\u6027\u68c0\u67e5 mro <\/p>\n<pre>print(domesticdog.__mro__)\n<\/pre>\n<p>python\u4e2d\u7684mro\u786e\u4fdddomesticdog\u6b63\u786e\u7ee7\u627f\u81eapet\u548cworkinganimal\uff0c\u5e76\u4e14animal\u5728\u5bf9\u8c61\u4e4b\u524d\u88ab\u89e3\u6790\u3002\u56e0\u6b64\uff0c\u58f0\u660e\u987a\u5e8f\u4f1a\u5f71\u54cd mro\uff0c\u4f46 c3 \u7ebf\u6027\u5316\u53ef\u786e\u4fdd\u5c0a\u91cd\u5c42\u6b21\u7ed3\u6784\u3002<\/p>\n<ol>\n<li> <strong>\u58f0\u660e\u987a\u5e8f<\/strong>\uff1amro \u4ece\u6700\u6d3e\u751f\u7684\u7c7b\u5f00\u59cb\uff0c\u9075\u5faa\u57fa\u7c7b\u58f0\u660e\u7684\u987a\u5e8f\u3002<\/li>\n<li> <strong>c3 \u7ebf\u6027\u5316<\/strong>\uff1a\u786e\u4fdd\u6bcf\u4e2a\u7c7b\u51fa\u73b0\u5728\u5176\u8d85\u7c7b\u4e4b\u524d\uff0c\u5e76\u4fdd\u6301\u7ee7\u627f\u987a\u5e8f\u3002<\/li>\n<\/ol>\n<h4> python <\/h4>\n<pre>stack = [] # we could just use a list as a stack\nstack.append(1)  # push\nstack.append(2)\nprint(stack.pop())  # pop\n<\/pre>\n<h4> c++98 <\/h4>\n<pre>#include &lt;stack&gt; \/\/ we have to import the stack type\nstd::stack&lt;int&gt; stack;\nstack.push(1);  \/\/ push\nstack.push(2);\nstd::cout &lt;&lt; stack.top() &lt;&lt; std::endl;  \/\/ top\nstack.pop();  \/\/ pop\n<\/pre>\n<h4> python <\/h4>\n<pre>from collections import deque\nqueue = deque()\nqueue.append(1)  # enqueue\nqueue.append(2)\nprint(queue.popleft())  # dequeue\n<\/pre>\n<h4> c++98 <\/h4>\n<pre>#include &lt;queue&gt;\nstd::queue&lt;int&gt; queue;\nqueue.push(1);  \/\/ enqueue\nqueue.push(2);\nstd::cout &lt;&lt; queue.front() &lt;&lt; std::endl;  \/\/ front\nqueue.pop();  \/\/ dequeue\n<\/pre>\n<h4> python <\/h4>\n<pre>map = {} # this is automatically creating a map (which is called a dictionary in python)\nmap['key1'] = 'value1'\nmap['key2'] = 'value2'\nprint(map['key1'])\n<\/pre>\n<h4> c++98 <\/h4>\n<pre>#include &lt;map&gt;\nstd::map&lt;std::string, std::string&gt; map;\nmap[\"key1\"] = \"value1\";\nmap[\"key2\"] = \"value2\";\nstd::cout &lt;&lt; map[\"key1\"] &lt;&lt; std::endl;\n<\/pre>\n<p>\u611f\u8c22\u60a8\u9075\u5faa\u672c\u6709\u5173 python \u548c c++98 \u4e2d\u7684 oop \u6982\u5ff5\u7684\u6307\u5357\u3002\u6211\u4eec\u5e0c\u671b\u5b83\u5bf9\u60a8\u7684\u5b66\u4e60\u4e4b\u65c5\u6709\u7528\u3002\u5982\u679c\u60a8\u559c\u6b22\u5185\u5bb9\uff0c\u8bf7\u7559\u4e0b\u60a8\u7684\u8bc4\u8bba\u3001\u70b9\u8d5e\u5e76\u5206\u4eab\u7ed9\u60a8\u7684\u670b\u53cb\u548c\u540c\u4e8b\u3002\u5982\u679c\u60a8\u53d1\u73b0\u9519\u8bef\uff0c\u8bf7\u7559\u4e0b\u60a8\u7684\u8bc4\u8bba\uff0c\u6211\u4f1a\u7ea0\u6b63\u5b83\uff01\u4e0b\u6b21\u89c1\uff01<\/p>\n<p>\u6587\u4e2d\u5173\u4e8e\u7684\u77e5\u8bc6\u4ecb\u7ecd\uff0c\u5e0c\u671b\u5bf9\u4f60\u7684\u5b66\u4e60\u6709\u6240\u5e2e\u52a9\uff01\u82e5\u662f\u53d7\u76ca\u532a\u6d45\uff0c\u90a3\u5c31\u52a8\u52a8\u9f20\u6807\u6536\u85cf\u8fd9\u7bc7\u300a\u9762\u5411 C++98 \u7a0b\u5e8f\u5458\u7684 Python \u4e2d\u7684 OOP \u6982\u5ff5\u300b\u6587\u7ae0\u5427\uff0c\u4e5f\u53ef\u5173\u6ce8\u516c\u4f17\u53f7\u4e86\u89e3\u76f8\u5173\u6280\u672f\u6587\u7ae0\u3002<\/p>\n<p>      \u7248\u672c\u58f0\u660e \u672c\u6587\u8f6c\u8f7d\u4e8e\uff1adev.to \u5982\u6709\u4fb5\u72af\uff0c\u8bf7\u8054\u7cfb\u5220\u9664<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9762\u5411 C++98 \u7a0b\u5e8f\u5458\u7684 Py&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4925],"tags":[],"class_list":["post-204871","post","type-post","status-publish","format-standard","hentry","category-4925"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/204871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=204871"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/204871\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=204871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=204871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=204871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}