🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)
🔧 AI Nachrichten Major AI platforms go down in unprecedented simultaneous outage(03.09.2026 um 17:34 Uhr)
🔧 AI Nachrichten ChatGPT, Claude, and Grok Down? Users Report Widespread Outages(03.09.2026 um 19:14 Uhr)
🔧 AI Nachrichten OpenAI Launches GPT-6 Astra, Says We May Have Entered the AGI Era(03.09.2026 um 22:08 Uhr)
🔧 AI Nachrichten Claude Comes to CarPlay as Fifth Major AI Chatbot App(05.09.2026 um 05:31 Uhr)
🔧 AI Nachrichten OpenAI’s GPT-6 Astra Is AGI, Says NVIDIA CEO Jensen Huang(07.09.2026 um 06:31 Uhr)
🔧 AI Nachrichten Blame AI companies for Mac mini and Mac Studio shortage(31.08.2026 um 10:32 Uhr)

🔧 Programmierung 🕛 kürzlich 9 Min Lesezeit
0

Conceitos de POO em Python para Programadores C++98

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht




Conceitos de POO em Python para Programadores C++98



Aqui está uma demonstração completa dos conceitos de POO em Python para um programador C++98:






Definição de Classe e Criação de Objetos






Python






CODE
# Privado por convenção: _underscore_simples
# "Realmente privado": __underscore_duplo (name mangling)
# Público: sem underscore

class Animal:
# Variável de classe (compartilhada por todas as instâncias) pode ser inicializada diretamente
species_count = 0

# 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
def make_sound(self):
pass # Equivalente a um método abstrato/virtual (não implementável na classe base)

# Método estático (não precisa de classe ou instância)
@staticmethod
def get_kingdom():
return "Animalia"

# Método de classe (recebe a classe como primeiro argumento)
@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)









C++98






CODE
#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)

// getters:
static std::string get_kingdom() {
return "Animalia";
}

static int get_species_count() {
return species_count;
}

int get_age() const {
return _age;
}

// setter:
void set_age(int age) {
if (age >= 0) {
_age = age;
}
}

std::string to_string() const {
return "Animal named " + name;
}

std::string repr() const {
std::ostringstream oss;
oss << "Animal(name='" << name << "', age=" << _age << ", id=" << __id << ")";
return oss.str();
}

bool operator==(const Animal& other) const {
return name == other.name;
}

// Sobrecarga do operador []
std::string operator[](const std::string& key) const {
if (key == "name") {
return name;
}
throw std::out_of_range("Invalid key");
}

// Método isinstance
template <typename T>
bool isinstance() const {
return dynamic_cast<const T*>(this) != nullptr;
}

protected:
std::string name;
int _age;

private:
int __id;
static int id_counter;
};

// variáveis estáticas de classe são compartilhadas por todas as instâncias mas
// precisam ser inicializadas separadamente.
int Animal::species_count = 0;
int Animal::id_counter = 0;









Herança






Python






CODE
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!"









C++98






CODE
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;
};









Herança Múltipla






Python






CODE
class Pet:
def is_vaccinated(self):
return True

class DomesticDog(Dog, Pet):
pass









C++98






CODE
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 Abstrata






Python






CODE
from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
pass









C++98






CODE
class Shape {
public:
virtual ~Shape() {}
virtual double area() const = 0;
};









Exemplo de Uso






Python






CODE
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__









C++98






CODE
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 []
}









Diferenças Chave entre Python e C++98




  1. Não há palavras-chave public/private/protected (use convenções de nomenclatura)

  2. A herança múltipla difere:


    • Python usa a Ordem de Resolução de Métodos (MRO) com linearização C3

    • Não há necessidade de herança virtual como em C++


    • super() segue automaticamente a MRO

    • A ordem das classes base importa em Python

    • Pode-se inspecionar a ordem de resolução com __mro__



  3. Todos os métodos são virtuais por padrão

  4. Não há necessidade de arquivos de cabeçalho

  5. Não há distinção entre ponteiros/referências

  6. Não há necessidade de gerenciamento de memória (coletor de lixo)

  7. Tudo é um objeto (incluindo funções)

  8. Tipagem dinâmica em vez de tipagem estática

  9. Decoradores de propriedade em vez de métodos getter/setter

  10. Métodos especiais usam o formato __name__ em vez da palavra-chave operator

  11. Sintaxe mais pythônica para sobrecarga de operadores (por exemplo, __eq__ vs operator==)



Use dir(object) para ver todos os atributos e métodos de um objeto, e help(object) para documentação.






Tópicos Especiais:






Problema da Herança Diamante






Problemas com Herança Diamante em C++98



A herança diamante ocorre quando uma classe herda de duas classes que, por sua vez, herdam de uma classe base comum. Isso pode causar vários problemas:





  1. Ambiguidade: Métodos e atributos da classe base comum podem se tornar ambíguos.


  2. Duplicação de Dados: Cada classe derivada pode ter sua própria cópia dos membros da classe base comum, levando a duplicação de dados.






Exemplo de Herança Diamante em C++98






CODE
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;
}









Comportamento Esperado






CODE
Animal constructor
Pet constructor
WorkingAnimal constructor
DomesticDog constructor
Pet sound






Neste exemplo, DomesticDog herda de Pet e WorkingAnimal, ambos herdando de Animal. Isso cria uma herança diamante. A herança virtual é usada para evitar duplicação de dados e ambiguidade.






Como Python Previne Automaticamente a Herança Diamante



Python usa a Ordem de Resolução de Métodos (MRO) com linearização C3 para resolver automaticamente os problemas de herança diamante. A MRO determina a ordem em que as classes são verificadas quando se procura por um método ou atributo.






Exemplo de Herança Diamante em Python






CODE
class Animal:
def make_sound(self):
print("Some generic animal sound")

class Pet(Animal):
def make_sound(self):
print("Pet sound")

class WorkingAnimal(Animal):
def make_sound(self):
print("Working animal sound")

class DomesticDog(Pet, WorkingAnimal):
pass

dog = DomesticDog()
dog.make_sound()









Comportamento Esperado






CODE
Pet sound






Neste exemplo, Python resolve automaticamente a herança diamante usando a MRO. Você pode verificar a MRO usando o atributo __mro__:




CODE
print(DomesticDog.__mro__)






A MRO em Python garante que DomesticDog herde corretamente de Pet e WorkingAnimal, e que Animal seja resolvida antes de object. Portanto, a ordem de declaração influencia a MRO, mas a linearização C3 garante que a hierarquia seja respeitada.






Explicação:





  1. Ordem de Declaração: A MRO começa pela classe mais derivada e segue a ordem em que as classes base são declaradas.


  2. Linearização C3: Garante que cada classe apareça antes de suas superclasses e que a ordem de herança seja mantida.






Estruturas de Dados: Stack, Queue e Map






Stack






Python






CODE
stack = [] # we could just use a list as a stack
stack.append(1) # push
stack.append(2)
print(stack.pop()) # pop









C++98






CODE
#include <stack> // we have to import the stack type
std::stack<int> stack;
stack.push(1); // push
stack.push(2);
std::cout << stack.top() << std::endl; // top
stack.pop(); // pop









Queue






Python






CODE
from collections import deque
queue = deque()
queue.append(1) # enqueue
queue.append(2)
print(queue.popleft()) # dequeue









C++98






CODE
#include <queue>
std::queue<int> queue;
queue.push(1); // enqueue
queue.push(2);
std::cout << queue.front() << std::endl; // front
queue.pop(); // dequeue









Map






Python






CODE
map = {}
map['key1'] = 'value1'
map['key2'] = 'value2'
print(map['key1'])









C++98






CODE
#include <map>
std::map<std::string, std::string> map;
map["key1"] = "value1";
map["key2"] = "value2";
std::cout << map["key1"] << std::endl;


Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
3 Quellen
GPT-6 Astra Release Today? OpenAI’s Next Major AI Model Is Almost Here
1 Quelle
Apple accuses OpenAI of destroying evidence as trade-secrets fight intensifies
1 Quelle
Major AI platforms go down in unprecedented simultaneous outage
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Conceitos de POO em Python para Programadores C++98

Thematisch verwandte Begriffe: Conceitos, Python, para, Programadores · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...