---
# System prepended metadata

title: Python Advanced Course

---

# Python Advanced Course
[toc]

## Lec 1 Class (4/13)
- Basic class
```python
class Car():
    """This is a class of Car"""

    def __init__(self, wheel, color) -> None:
        self.wheel = wheel
        self.color = color

    def print(self):
        """Print the info of car"""
        print(f'This is a {self.color} car with {self.wheel} wheels')
```

- Inheritance
```python
class Company():
   def __init__(self, name) -> None:
       self.name = name
        
   def print(self) -> None:
       print(f'{self.name} Inc. ')
        
class ASUS(Company):
   def __init__(self, capital) -> None:
       super().__init__('ASUS')
       self.capitol = capital
    
   def print_Asus(self) -> None:
       print(f'{self.name} Inc. has {self.capital} money')
        
```

- Polymorphism
```python
class Company():
   def __init__(self, name) -> None:
       self.name = name
        
   def print(self) -> None:
       print(f'{self.name} Inc. ')
        
class ASUS(Company):
   def __init__(self, capital) -> None:
       super().__init__('ASUS')
       self.capitol = capital
    
   def print(self) -> None:
       print(f'{self.name} Inc. has {self.capital} money')
        
```

```python
class Point():
   def __init__(self, x, y) -> None:
       self.x = x
       self.y = y
    
   def __add__(self, other) -> 'Point':
       new_x = self.x + other.x
       new_y = self.y + other.y
       return Point(new_x, new_y)
    
   def __str__(self) -> str:
       return f'({self.x}, {self.y})'

a1 = Point(1, 8)
a2 = Point(10, 3)
a3 = a1 + a2
print(a3)
```

- Encapsulation
```python
class BankAccount:
   def __init__(self, balance):
       self.__balance = balance
   def deposit(self, amount):
       self.__balance += amount
   def withdraw(self, amount):
       if self.__balance >= amount:
           self.__balance -= amount
       else:
           print("Insufficient balance.")
   def get_balance(self):
       return self.__balance
    
my_account = BankAccount(100.0)
my_account.deposit(50.0)
print(my_account.get_balance())  # 150.0
print(my_account.__balance)  # Error
```

- Access Modifiers
```python
class MyPrivateClass:
   def __init__(self):
       self.__my_private_variable = 10
   def __my_private_method(self):
       print("This is a private method")
   def my_public_method(self):
       self.__my_private_method()

class MyClass:
   def __init__(self):
       self._my_protected_variable = 10
   def _my_protected_method(self):
       print("This is a protected method")

class MySubclass(MyClass):
   def my_public_method(self):
       self._my_protected_method()

```

- Decorators
```python
def print_func_name(func):
   def wrap(name):
       print(f"Now use function '{func.__name__}'")
       func(name)
   return wrap

def print_Hello(name):
   print(f'Hello, {name}')

print_func_name(print_Hello)('Allen')
```

```python
def print_func_name(func):
   def wrap(name):
       print(f"Now use function '{func.__name__}'")
       func(name)
   return wrap

@print_func_name
def print_Hello(name):
   print(f'Hello, {name}')

print_Hello('Allen')
```

```python
import time

def print_func_name(time):
   def decorator(func):
       def wrap(name):
           print(f"Now use function '{func.__name__}'")
           print(f"Now Unix time is {int(time)}.")
           func(name)
       return wrap
   return decorator

@print_func_name(time=time.time())
def print_Hello(name):
   print(f'Hello, {name}')

print_Hello('Wilson')
```