Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/foyez/oop
Basic concepts of object oriented programming
https://github.com/foyez/oop
object-oriented-programming oop programming-paradigms
Last synced: 6 days ago
JSON representation
Basic concepts of object oriented programming
- Host: GitHub
- URL: https://github.com/foyez/oop
- Owner: foyez
- Created: 2019-01-11T06:15:26.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-10-30T21:15:28.000Z (3 months ago)
- Last Synced: 2024-10-30T22:19:44.437Z (3 months ago)
- Topics: object-oriented-programming, oop, programming-paradigms
- Language: Python
- Homepage:
- Size: 47.9 KB
- Stars: 5
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Object Oriented Programming
## What is OOP?
Object oriented programming is a method of programming that attempts to model some process or thing in the world as a **class** or **object**.## Class
View contents
**Class:** - A blueprint for objects. Classes can contain methods (functions) and attributes (simmilar to keys in a object or dict).
### Instance
**Instance:** - Objects that are constructed from a class blueprint that contain their class's methods and properties.
**Instantiating:** Creating an object that is an instance of a class is called instantiating a class.
### Creating a Class
**In Python:**
```py
# vehicle.py
# _name - private variable or private property or method
# __name -class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = yearcar = Vehicle('Audi', '45d', 2018)
```
`Classes in Python can have a special __init__ method, which gets called every time you create an instance of the class (instantiate). The self keyword refers to the current class instance.`
**In Javascript:**
```js
class Vehicle {
constructor(make, model, year) {
this.make = make
this.model = model
this.year = year
}
}car = new Vehicle('Audi', '45d', 2018)
```
## Why OOP?
With object oriented programming, the goal is to *encapsulate* your code into **logical, hierarchical groupings using classes** so that you can reason about your code at higher level.
## 4 fundamental concepts of OOP
1. Abstraction
2. Encapsulation
3. Inheritance
4. Polymorphism## 1. Abstraction
View contents
**Abstraction:** - Abstraction captures the essential attributes and behavior based on the context, while ignores the irrelvent information.
For example, the essential attributes and behavior for a student from the perspective of academic:
Attributes: (Course Name, Grade, Student ID, etc.)
Behavior: (Studying, Doing Assignments, Attending Lectures, etc.)But the hobby of a student or the favorite sports of a student is not important here.
## 2. Encapsulation
View contents
**Encapsulation** - Encapsulation means a sort capsule that contains something inside, some of which can be accessed from outside and some of which cannot. In programming, encapsulation means the practice of keeping fields within a class private, then providing access to those fields via public methods (e.g. getter and setter methods).
**Example:**
* Let designing a Deck class, we make cards a private attribute (a list)
* The length of the cards should be accessed via a public method called count() --i.e. Deck.count()
## 3. Inheritance
View contents
**Inheritance:** A key feature of OOP is the ability to define a class which inherits from another class (a "base" or "parent" class).
**Example:**
**In Python:**
```py
class User:
active_users = 0def __init__(self, first_name: str, last_name: str, age: int = 18):
self._first_name = first_name # instance variable
self._last_name = last_name # instance variable
self.__age = agedef __repr__(self):
return f"{self._first_name} is {self.__age}."
# def __str__(self):
# return f"{self._first_name} is {self.__age}."@property
def full_name(self):
return f"{self._first_name} {self._last_name}"@full_name.setter
def full_name(self, name):
self._first_name, self._last_name = name.split(' ')@classmethod
def display_active_users(cls):
return f"There are currently {cls.active_users} active users"def description(self):
return f"{self._first_name} is a general user."def birthday(self):
self.__age += 1
return f"Happy {self.__age}th, {self._first_name}"def login(self):
User.active_users += 1def logout(self):
User.active_users -= 1
return f"{self._first_name} has logged out"class Moderator(User):
def __init__(self, first_name, last_name, community):
super().__init__(first_name, last_name)
self.__community = community# override method
def description(self):
return f"{self._first_name} is a moderator."def remove_post(self):
return f"{self.full_name} removed a post from the {self.__community} community"generalUser = User('Foyez', 'Ahmed')
moderator = Moderator('Sohel', 'Mahmud', 'cricket')print(generalUser)
print(generalUser.__dict__)
print(moderator.__dict__)
print()print(generalUser.full_name)
generalUser.full_name = 'Manam Ahmed'
print(generalUser.full_name)
print()print(generalUser.description())
print(moderator.description())
print()generalUser.login()
print(User.display_active_users())print(moderator.remove_post())
```**In Javascript:**
```js
// Class syntax or syntactical sugar
// myPerson --> Person.prototype --> Object.prototype --> nullconst activeUsers = Symbol('activeUsers')
class User {
constructor(firstName, lastName, age = 18) {
User[activeUsers] = 0
this._firstName = firstName // instance variable
this._lastName = lastName
this._age = age
}get fullName() {
return `${this._firstName} ${this._lastName}`
}set fullName(name) {
;[this._firstName, this._lastName] = name.split(' ')
}static display_active_users() {
return `There are currently ${User[activeUsers]} active users`
}description() {
return `${this._firstName} is a general user.`
}birthday() {
this._age += 1
return `Happy ${this._age}th, ${this._firstName}`
}login() {
User[activeUsers] += 1
}logout() {
User[activeUsers] -= 1
return `${this._firstName} has logged out`
}
}class Moderator extends User {
// js isn't strict about arity
constructor(firstName, community) {
super(firstName)
this._community = community
}// override method
description() {
return `${this._firstName} is a moderator.`
}remove_post() {
return `${this.fullName} removed a post from the ${this._community} community`
}
}generalUser = new User('Foyez', 'Ahmed', 20)
moderator = new Moderator('Sohel', 'cricket')console.log(generalUser.fullName)
generalUser.fullName = 'Manam Ahmed'
console.log(generalUser.fullName)
console.log()console.log(generalUser.description())
console.log(moderator.description())
console.log()console.log(generalUser.birthday())
console.log(moderator.birthday())
console.log()generalUser.login()
console.log(User.display_active_users())console.log(moderator.remove_post())
```## 4. Polymorphism
View contents
**Polymorphism:** The ability of an object to have different or many (poly) forms (morph) depending on the context.
**Example 1: The same class method works in a similar way for different classes**
```py
Cat.speak() # meow
Dog.speak() # woof
Human.speak() # yo
```At a high level the `speak()` method doing the same thing, but at a low level the implementation of the method is totally different.
**Example 2: The operation works for different kinds of objects**
```py
sample_list = [1, 2, 3]
sample_tuple = (1, 2, 3)
sample_string = 'awesome'len(sample_list)
len(sample_tuple)
len(sample_string)
```## Polymorphism & Inheritance
**1. The same class method works in a similar way for different classes**
A common implementation of this is to have a method in a base (or parent) class that is overriden by a subclass. This is called method **overridening**.
The same class method means that it have the same method signature (same name, same arguments & same return types).* Each subclass will have a different implementation of the method.
* If the method is not implemented in the subclass, the version in the parent class is called instead.```py
class Animal():
def speak(self):
raise NotImplementedError('Subclass needs to implement this method')class Dog(Animal):
def speak(self):
return 'woof'class Cat(Animal):
def speak(self):
return 'meow'class Fish(Animal):
passd = Dog()
print(d.speak())f = Fish()
print(f.speak())
```**2. (Polymorphism) The same operation works for different kinds of objects**
```py
8 + 2 # 10
'8' + '2' # 82
```
## References
1. [What Are OOP Concepts?](https://stackify.com/oops-concepts-in-java/)
2. [How to Use Object-Oriented Programming in Python – Key OOP Concepts and Interview Questions for Beginners](https://www.freecodecamp.org/news/object-oriented-programming-in-python-interview-questions/)