Python是一种面向对象的编程语言,具有简单易学、强大灵活、可移植性强等优点,越来越得到广泛应用。面向对象编程是Python开发中的重要部分,通过对象化的编程方式可以使代码更加模块化和可维护。
本篇文章将讲述Python面向对象编程的实践指南,包括四个方面:类和对象、继承和多态、封装和数据隐藏、类方法和静态方法。
一、类和对象
类是Python中的一种数据类型,用于定义对象的属性和行为。类通过定义属性和方法来描述对象的状态和行为。对象则是类的实例,具有类属性和类方法所定义的特性。
下面是一个示例代码:
```python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is %s, I'm %d years old." % (self.name, self.age))
p1 = Person("Alice", 18)
p1.say_hello()
```
上面代码定义了一个Person类和一个实例p1,其中类有两个属性name和age,并且有一个方法say_hello。在p1实例化后,可以通过调用方法say_hello打印出“Hello, my name is Alice, I'm 18 years old.”。
二、继承和多态
继承是面向对象编程中的重要概念,可以使类之间形成继承关系,从而体现类的层次结构。通过继承,子类可以继承父类的属性和方法,并可以在此基础上添加新的属性和方法。
多态则是指相同的操作可以作用于不同的对象上,而产生不同的结果。多态可以在继承和接口的基础上实现。
下面是一个示例代码:
```python
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
print("%s: wang wang!" % self.name)
class Cat(Animal):
def make_sound(self):
print("%s: miao miao!" % self.name)
def play(animal):
animal.make_sound()
dog = Dog("Bob")
cat = Cat("Tom")
play(dog)
play(cat)
```
上面代码定义了一个Animal类和两个子类Dog和Cat。在play函数中,参数animal是一个Animal类型的对象,可以传入Dog或Cat对象,因为它们都是Animal类的子类。在调用play函数时,会根据传入的对象类型打印不同的信息。
三、封装和数据隐藏
封装是面向对象编程中的一种重要特性,它指的是将对象的状态和行为封装在一个类中,并对外部隐藏细节。数据隐藏则是指对象的内部状态对外部不可见,只能通过类提供的接口进行访问。
下面是一个示例代码:
```python
class BankAccount:
def __init__(self, account_id):
self.__account_id = account_id
self.__balance = 0
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Insufficient balance!")
def get_balance(self):
return self.__balance
account = BankAccount("1001")
account.deposit(1000)
print(account.get_balance())
account.withdraw(500)
print(account.get_balance())
```
上面代码实现了一个BankAccount类,其中私有属性__account_id和__balance都不能从外部直接访问。通过定义公有方法deposit、withdraw和get_balance,可以实现对于对象内部状态的访问和修改。
四、类方法和静态方法
类方法是定义在类上的方法,可以使用类名调用,可以访问类属性并修改它们。静态方法是定义在类上的无需访问类属性的功能性方法。
下面是一个示例代码:
```python
class Employee:
__employee_count = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
@classmethod
def increase_count(cls):
cls.__employee_count += 1
@staticmethod
def is_workday(day):
if day.weekday() >= 5:
return False
return True
emp1 = Employee("Alice", 5000)
emp2 = Employee("Bob", 6000)
Employee.increase_count()
print(Employee._Employee__employee_count)
print(Employee.is_workday(datetime.date(2021, 11, 6)))
```
上面代码实现了一个Employee类,其中增加了一个类属性__employee_count和类方法increase_count,用于统计Employee的工作人数。静态方法is_workday用于判断某一天是否为工作日。注意到类属性需要使用类名调用,而普通属性是对象的属性,需要通过实例化后访问。