Python 面向对象之 class 和封装
Python 是一种面向对象的编程语言,使用面向对象的思想可以更好地组织和管理代码,提高代码的可维护性和可复用性。在 Python 中,class 是面向对象的重要组成部分,而封装则是实现面向对象的重要机制之一。
class
class 是 Python 中面向对象编程的基础组成部分,可以通过 class 来定义一个对象的属性和方法。
class Car:
def __init__(self, brand, color):
self.brand = brand
self.color = color
def run(self):
print(f'{self.color} {self.brand} is running.')
上面的代码定义了一个 Car 类,其中包含两个属性 brand 和 color,以及一个方法 run。其中,init 方法是类的构造函数,用于初始化对象的属性;而方法 run 则是对象的一个行为,用于模拟汽车的运行行为,并打印出汽车的品牌和颜色。
car = Car('Audi', 'Black')
car.run()
通过上述代码可以定义一个名为 car 的 Car 类对象,并通过调用 run 方法,模拟汽车的运行行为。
封装
封装是面向对象编程中的一种重要机制,在 Python 中可以通过访问控制权限来实现封装。
在 Python 中,有 3 种访问控制权限:
- public:公有的,在类内部和外部都可以访问。
- protected:受保护的,在类内部可以访问,在外部不建议直接访问。
- private:私有的,只能在类内部访问,外部无法访问。
通过在属性或方法名前加上下划线来控制访问权限。
class Student:
def __init__(self, name, age):
self.name = name
self._age = age
self.__score = 0
def do_homework(self):
print(f'{self.name} is doing homework.')
def take_exam(self, score):
self.__score = score
def get_score(self):
return self.__score
上述代码定义了一个 Student 类,其中包含 3 个属性 name、_age 和 __score,以及 3 个方法 do_homework、take_exam 和 get_score。
在属性 _age 前面加上了一个下划线,表示这个属性是受保护的,在类内部可以访问,在外部不建议直接访问;在属性 __score 前面加上了两个下划线,表示这个属性是私有的,在类内部可以访问,在外部无法访问。
student = Student('Tom', 18)
print(student.name)
print(student._age)
student.do_homework()
student.take_exam(90)
print(student.get_score())
通过上述代码可以定义一个名为 student 的 Student 类对象,并通过调用相关方法和属性,模拟学生的学习和考试行为。其中,由于 __score 属性是私有的,外部无法直接访问,所以需要通过 get_score 方法来获取学生成绩。
示例说明
示例一:封装私有属性
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
self.__id_card = '0000000000000000'
def get_id_card(self):
return self.__id_card
def set_id_card(self, id_card):
if len(id_card) == 18 and id_card.isdigit():
self.__id_card = id_card
else:
raise ValueError('Invalid id card.')
person = Person('Tom', 18, 'male')
person.set_id_card('111111111111111111')
print(person.get_id_card()) # 输出:111111111111111111
person.set_id_card('111') # 抛出 ValueError 异常,提示无效的身份证号码
上面的代码定义了一个 Person 类,其中包含 4 个属性 name、age、gender 和 __id_card,以及两个方法 get_id_card 和 set_id_card。
由于 __id_card 属性是私有的,外部无法直接访问,所以需要通过 get_id_card 和 set_id_card 方法来获取和设置身份证号码。在 set_id_card 方法内部对身份证号码进行了简单的校验,只有当新的身份证号码长度为 18 并且全是数字时才允许设置成功。
示例二:封装私有方法
class StringHelper:
def __init__(self, string):
self.string = string
def reverse(self):
def _reverse(string):
if len(string) <= 1:
return string
return _reverse(string[1:]) + string[0]
return _reverse(self.string)
def __clean(self, string):
return ''.join(filter(str.isalnum, string)).lower()
def is_palindrome(self):
return self.__clean(self.string) == self.__clean(self.reverse())
string_helper = StringHelper('A man, a plan, a canal: Panama')
print(string_helper.reverse()) # 输出:amanaP :lanac a ,nalp a ,nam A
print(string_helper.is_palindrome()) # 输出:True
上面的代码定义了一个 StringHelper 类,其中包含 2 个属性 string 和一个私有方法 __clean,以及 2 个方法 reverse 和 is_palindrome。
由于 __clean 方法是私有的,外部无法直接访问,所以需要通过 reverse 方法来调用它。__clean 方法的作用是将字符串中的非字母和数字字符过滤掉,并将剩余的字符转换成小写字母,用来判断是否回文。is_palindrome 方法调用了 reverse 方法和 __clean 方法,用来判断当前字符串是否回文。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 面向对象之class和封装 - Python技术站