Concepts POO en Python pour les programmeurs C 98
Voici une démonstration complète des concepts de POO en Python pour un programmeur C 98 :
Définition de classe et création d'objets
Python
# Privado por convenção: _underscore_simples # "Realmente privado": __underscore_duplo (name mangling) # Público: sem underscore from abc import abstractmethod class Animal(ABC): # Em python, variáveis declaradas no escopo da classe e não dentro de um # método específico, são automaticamente compartilhadas por todas instâncias. species_count = 0 # além disso, elas podem ser inicializadas diretamente dentro da classe. # Construtor def __init__(self, name): # Variáveis de instância self.name = name # público self._age = 0 # protegido por convenção self.__id = id(self) # privado (mas você consegue acessar com name mangling) Animal.species_count += 1 # Destrutor def __del__(self): Animal.species_count -= 1 # Método regular @abstractmethod def make_sound(self): pass # Equivalente a um método abstrato/virtual (deve ser implementado apenas nas classes filhas) # Método estático (não precisa da instância para ser utilizado, nem utiliza seus atributos) @staticmethod def get_kingdom(): return "Animalia" # Método de classe (recebe a classe como primeiro argumento, pode acessar atributos da classe) @classmethod def get_species_count(cls): return cls.species_count # Decorador de propriedade (getter) @property def age(self): return self._age # Decorador de propriedade (setter) @age.setter def age(self, value): if value >= 0: self._age = value # Métodos especiais (sobrecarga de operadores) def __str__(self): # Como toString() - para string legível return f"Animal named {self.name}" def __repr__(self): # Para debugging return f"Animal(name='{self.name}')" def __eq__(self, other): # Operador de comparação == return isinstance(other, Animal) and self.name == other.name def __len__(self): # Função len() return self._age def __getitem__(self, key): # Operador de acesso [] if key == 'name': return self.name raise KeyError(key)
C98
#include <iostream> #include <string> #include <sstream> class Animal { public: static int species_count; Animal(const std::string& name) : name(name), _age(0), __id(++id_counter) { // construtor ++species_count; } ~Animal() { // destrutor --species_count; } virtual void make_sound() = 0; // Método não implementável na classe base (virtual/abstrato) static std::string get_kingdom() { // Não existe distinção entre // @classmethod e @staticmethod em cpp, apenas static methods. return "Animalia"; } // static methods podem ser utilizados sem instanciar uma classe e têm // acesso às propriedades estáticas da classe: static int get_species_count() { return species_count; } // getter: int get_age() const { return _age; } // setter: void set_age(int age) { if (age >= 0) { _age = age; } } // Implementação dos métodos especiais que vimos em python: std::string to_string() const { return "Animal named " + name; } std::string repr() const { std::ostringstream oss; oss << "Animal(name='" << name << "', age=" << _age << ",> <h2> Herança </h2> <h3> Python </h3> <pre class="brush:php;toolbar:false">class Dog(Animal): def __init__(self, name, breed): # Chama o construtor da classe pai super().__init__(name) self.breed = breed # Sobrescreve o método da classe pai def make_sound(self): return "Woof!"
C98
class Dog : public Animal { public: Dog(const std::string& name, const std::string& breed) : Animal(name), breed(breed) {} void make_sound() override { std::cout << "Woof!" << std::endl; } private: std::string breed; };
Héritage Multiple
Python
class Pet: def is_vaccinated(self): return True class DomesticDog(Dog, Pet): pass
C98
class Pet { public: bool is_vaccinated() const { return true; } }; class DomesticDog : public Dog, public Pet { public: DomesticDog(const std::string& name, const std::string& breed) : Dog(name, breed) {} };
Classe abstraite
Python
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass
C98
class Shape { public: virtual ~Shape() {} virtual double area() const = 0; };
Exemple d'utilisation
Python
if __name__ == "__main__": # Cria objetos dog = Dog("Rex", "Golden Retriever") # Acessa atributos print(dog.name) # Público print(dog._age) # Protegido (ainda acessível) # print(dog.__id) # Isso falhará print(dog._Animal__id) # Isso funciona (acessando attribute privado com name mangling) # Propriedades dog.age = 5 # Usa setter automaticamente print(dog.age) # Usa getter automaticamente # Métodos estáticos e de classe print(Animal.get_kingdom()) print(Animal.get_species_count()) # Verifica herança print(isinstance(dog, Animal)) # True print(issubclass(Dog, Animal)) # True # Métodos especiais em ação print(str(dog)) # Usa __str__ print(repr(dog)) # Usa __repr__ print(len(dog)) # Usa __len__ print(dog['name']) # Usa __getitem__
C98
int main() { // Cria objetos Dog dog("Rex", "Golden Retriever"); // Acessa atributos std::cout << dog.name << std::endl; // Público std::cout << dog.get_age() << std::endl; // Protegido (ainda acessível) // std::cout << dog.__id << std::endl; // Isso falhará (privado) // Propriedades dog.set_age(5); // Usa setter std::cout << dog.get_age() << std::endl; // Usa getter // Métodos estáticos e de classe std::cout << Animal::get_kingdom() << std::endl; std::cout << Animal::get_species_count() << std::endl; // Equivalente aos "métodos especiais": // Verifica herança if (dog.isinstance<Animal>()) { std::cout << "dog é uma instância de Animal" << std::endl; } std::cout << dog.to_string() << std::endl; // Usa to_string std::cout << dog.repr() << std::endl; // Usa repr std::cout << dog["name"] << std::endl; // Usa operador [] }
Principales différences entre Python et C 98
- Aucun mot-clé public/privé/protégé (utilisez les conventions de dénomination)
- L'héritage multiple diffère :
- Python utilise l'ordre de résolution de méthode (MRO) avec linéarisation C3
- Pas besoin d'héritage virtuel comme en C
- super() suit automatiquement le MRO
- L'ordre des classes de base compte en Python
- Vous pouvez consulter l'ordre de résolution avec __mro__
- Toutes les méthodes sont virtuelles par défaut
- Il n'y a pas de distinction entre pointeurs/références
- Pas besoin de gestion de mémoire (garbage collector)
- Saisie dynamique au lieu de saisie statique
- Décorateurs de propriétés au lieu de méthodes getter/setter
- Les méthodes spéciales utilisent le format __name__ au lieu du mot-clé Operator
- Plus de syntaxe pythonique pour la surcharge d'opérateurs (par exemple __eq__ vs Operator==)
Utilisez dir(object) pour voir tous les attributs et méthodes d'un objet, et help(object) pour la documentation.
Thèmes spéciaux :
Problème d'héritage des diamants
Animal . ' , _______ _ .`_|___|_`. _ Pet \ \ / / WorkingAnimal \ ' ' / \ " / \./ DomesticDog
Problèmes avec l'héritage des diamants dans C 98
L'héritage diamant se produit lorsqu'une classe hérite de deux classes qui, à leur tour, héritent d'une classe de base commune. Cela peut poser plusieurs problèmes :
- Ambiguïté : Les méthodes et attributs de la classe de base commune peuvent devenir ambigus.
- Duplication de données : Chaque classe dérivée peut avoir sa propre copie des membres de la classe de base commune, conduisant à une duplication de données.
Exemple d'héritage de diamant en C 98
class Animal { public: Animal() { std::cout << "Animal constructor" << std::endl; } virtual void make_sound() { std::cout << "Some generic animal sound" << std::endl; } }; class Pet : public Animal { public: Pet() : Animal() { std::cout << "Pet constructor" << std::endl; } void make_sound() override { std::cout << "Pet sound" << std::endl; } }; class WorkingAnimal : public Animal { public: WorkingAnimal() : Animal() { std::cout << "WorkingAnimal constructor" << std::endl; } void make_sound() override { std::cout << "Working animal sound" << std::endl; } }; class DomesticDog : public Pet, public WorkingAnimal { public: DomesticDog() : Animal(), Pet(), WorkingAnimal() { std::cout << "DomesticDog constructor" << std::endl; } void make_sound() override { Pet::make_sound(); // Ou WorkingAnimal::make_sound(), dependendo do comportamento desejado } }; int main() { DomesticDog dog; dog.make_sound(); return 0; }
Comportement attendu
Animal constructor Pet constructor WorkingAnimal constructor DomesticDog constructor Pet sound
Dans cet exemple, DomesticDog hérite de Pet et WorkingAnimal, qui héritent tous deux d'Animal. Cela crée un diamant héritage. L'héritage virtuel est utilisé pour éviter la duplication et l'ambiguïté des données.
Comment Python empêche automatiquement l'héritage des diamants
Python utilise l'ordre de résolution de méthode (MRO) avec la linéarisation C3 pour résoudre automatiquement les problèmes d'héritage de diamant. MRO détermine l'ordre dans lequel les classes sont vérifiées lors de la recherche d'une méthode ou d'un attribut.
Exemple d'héritage de diamant en Python
# Privado por convenção: _underscore_simples # "Realmente privado": __underscore_duplo (name mangling) # Público: sem underscore from abc import abstractmethod class Animal(ABC): # Em python, variáveis declaradas no escopo da classe e não dentro de um # método específico, são automaticamente compartilhadas por todas instâncias. species_count = 0 # além disso, elas podem ser inicializadas diretamente dentro da classe. # Construtor def __init__(self, name): # Variáveis de instância self.name = name # público self._age = 0 # protegido por convenção self.__id = id(self) # privado (mas você consegue acessar com name mangling) Animal.species_count += 1 # Destrutor def __del__(self): Animal.species_count -= 1 # Método regular @abstractmethod def make_sound(self): pass # Equivalente a um método abstrato/virtual (deve ser implementado apenas nas classes filhas) # Método estático (não precisa da instância para ser utilizado, nem utiliza seus atributos) @staticmethod def get_kingdom(): return "Animalia" # Método de classe (recebe a classe como primeiro argumento, pode acessar atributos da classe) @classmethod def get_species_count(cls): return cls.species_count # Decorador de propriedade (getter) @property def age(self): return self._age # Decorador de propriedade (setter) @age.setter def age(self, value): if value >= 0: self._age = value # Métodos especiais (sobrecarga de operadores) def __str__(self): # Como toString() - para string legível return f"Animal named {self.name}" def __repr__(self): # Para debugging return f"Animal(name='{self.name}')" def __eq__(self, other): # Operador de comparação == return isinstance(other, Animal) and self.name == other.name def __len__(self): # Função len() return self._age def __getitem__(self, key): # Operador de acesso [] if key == 'name': return self.name raise KeyError(key)
Comportement attendu
#include <iostream> #include <string> #include <sstream> class Animal { public: static int species_count; Animal(const std::string& name) : name(name), _age(0), __id(++id_counter) { // construtor ++species_count; } ~Animal() { // destrutor --species_count; } virtual void make_sound() = 0; // Método não implementável na classe base (virtual/abstrato) static std::string get_kingdom() { // Não existe distinção entre // @classmethod e @staticmethod em cpp, apenas static methods. return "Animalia"; } // static methods podem ser utilizados sem instanciar uma classe e têm // acesso às propriedades estáticas da classe: static int get_species_count() { return species_count; } // getter: int get_age() const { return _age; } // setter: void set_age(int age) { if (age >= 0) { _age = age; } } // Implementação dos métodos especiais que vimos em python: std::string to_string() const { return "Animal named " + name; } std::string repr() const { std::ostringstream oss; oss << "Animal(name='" << name << "', age=" << _age << ",> <h2> Herança </h2> <h3> Python </h3> <pre class="brush:php;toolbar:false">class Dog(Animal): def __init__(self, name, breed): # Chama o construtor da classe pai super().__init__(name) self.breed = breed # Sobrescreve o método da classe pai def make_sound(self): return "Woof!"
Dans cet exemple, Python résout automatiquement l'héritage des diamants à l'aide de MRO. Vous pouvez vérifier MRO en utilisant l'attribut __mro__:
class Dog : public Animal { public: Dog(const std::string& name, const std::string& breed) : Animal(name), breed(breed) {} void make_sound() override { std::cout << "Woof!" << std::endl; } private: std::string breed; };
MRO en Python garantit que DomesticDog hérite correctement de Pet et WorkingAnimal, et qu'Animal est résolu avant l'objet. L'ordre de déclaration influence donc le MRO, mais la linéarisation C3 garantit le respect de la hiérarchie.
Explication:
- Ordre de déclaration : MRO commence par la classe la plus dérivée et suit l'ordre dans lequel les classes de base sont déclarées.
- Linéarisation C3 : Garantit que chaque classe apparaît avant ses superclasses et que l'ordre d'héritage est maintenu.
Structures de données : pile, file d'attente et carte
Empiler
Python
class Pet: def is_vaccinated(self): return True class DomesticDog(Dog, Pet): pass
C98
class Pet { public: bool is_vaccinated() const { return true; } }; class DomesticDog : public Dog, public Pet { public: DomesticDog(const std::string& name, const std::string& breed) : Dog(name, breed) {} };
File d'attente
Python
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass
C98
class Shape { public: virtual ~Shape() {} virtual double area() const = 0; };
Carte
Python
if __name__ == "__main__": # Cria objetos dog = Dog("Rex", "Golden Retriever") # Acessa atributos print(dog.name) # Público print(dog._age) # Protegido (ainda acessível) # print(dog.__id) # Isso falhará print(dog._Animal__id) # Isso funciona (acessando attribute privado com name mangling) # Propriedades dog.age = 5 # Usa setter automaticamente print(dog.age) # Usa getter automaticamente # Métodos estáticos e de classe print(Animal.get_kingdom()) print(Animal.get_species_count()) # Verifica herança print(isinstance(dog, Animal)) # True print(issubclass(Dog, Animal)) # True # Métodos especiais em ação print(str(dog)) # Usa __str__ print(repr(dog)) # Usa __repr__ print(len(dog)) # Usa __len__ print(dog['name']) # Usa __getitem__
C98
int main() { // Cria objetos Dog dog("Rex", "Golden Retriever"); // Acessa atributos std::cout << dog.name << std::endl; // Público std::cout << dog.get_age() << std::endl; // Protegido (ainda acessível) // std::cout << dog.__id << std::endl; // Isso falhará (privado) // Propriedades dog.set_age(5); // Usa setter std::cout << dog.get_age() << std::endl; // Usa getter // Métodos estáticos e de classe std::cout << Animal::get_kingdom() << std::endl; std::cout << Animal::get_species_count() << std::endl; // Equivalente aos "métodos especiais": // Verifica herança if (dog.isinstance<Animal>()) { std::cout << "dog é uma instância de Animal" << std::endl; } std::cout << dog.to_string() << std::endl; // Usa to_string std::cout << dog.repr() << std::endl; // Usa repr std::cout << dog["name"] << std::endl; // Usa operador [] }
Merci d'avoir suivi ce guide sur les concepts de POO en Python et C 98. Nous espérons qu'il vous a été utile pour votre parcours d'apprentissage. Si vous avez aimé le contenu, laissez votre commentaire, aimez et partagez avec vos amis et collègues. Si vous avez trouvé une erreur, laissez votre commentaire et je la corrigerai ! À la prochaine fois !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Python est plus facile à apprendre et à utiliser, tandis que C est plus puissant mais complexe. 1. La syntaxe Python est concise et adaptée aux débutants. Le typage dynamique et la gestion automatique de la mémoire le rendent facile à utiliser, mais peuvent entraîner des erreurs d'exécution. 2.C fournit des fonctionnalités de contrôle de bas niveau et avancées, adaptées aux applications haute performance, mais a un seuil d'apprentissage élevé et nécessite une gestion manuelle de la mémoire et de la sécurité.

Pour maximiser l'efficacité de l'apprentissage de Python dans un temps limité, vous pouvez utiliser les modules DateTime, Time et Schedule de Python. 1. Le module DateTime est utilisé pour enregistrer et planifier le temps d'apprentissage. 2. Le module de temps aide à définir l'étude et le temps de repos. 3. Le module de planification organise automatiquement des tâches d'apprentissage hebdomadaires.

Python est meilleur que C dans l'efficacité du développement, mais C est plus élevé dans les performances d'exécution. 1. La syntaxe concise de Python et les bibliothèques riches améliorent l'efficacité du développement. Les caractéristiques de type compilation et le contrôle du matériel de CC améliorent les performances d'exécution. Lorsque vous faites un choix, vous devez peser la vitesse de développement et l'efficacité de l'exécution en fonction des besoins du projet.

Est-ce suffisant pour apprendre Python pendant deux heures par jour? Cela dépend de vos objectifs et de vos méthodes d'apprentissage. 1) Élaborer un plan d'apprentissage clair, 2) Sélectionnez les ressources et méthodes d'apprentissage appropriées, 3) la pratique et l'examen et la consolidation de la pratique pratique et de l'examen et de la consolidation, et vous pouvez progressivement maîtriser les connaissances de base et les fonctions avancées de Python au cours de cette période.

Python et C ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1) Python convient au développement rapide et au traitement des données en raison de sa syntaxe concise et de son typage dynamique. 2) C convient à des performances élevées et à une programmation système en raison de son typage statique et de sa gestion de la mémoire manuelle.

PythonlistSaReparmentofthestandardLibrary, tandis que les coloccules de colocède, tandis que les colocculations pour la base de la Parlementaire, des coloments de forage polyvalent, tandis que la fonctionnalité de la fonctionnalité nettement adressée.

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

Les applications de Python en informatique scientifique comprennent l'analyse des données, l'apprentissage automatique, la simulation numérique et la visualisation. 1.Numpy fournit des tableaux multidimensionnels et des fonctions mathématiques efficaces. 2. Scipy étend la fonctionnalité Numpy et fournit des outils d'optimisation et d'algèbre linéaire. 3. Pandas est utilisé pour le traitement et l'analyse des données. 4.Matplotlib est utilisé pour générer divers graphiques et résultats visuels.
