前言
Python是一种功能强大的编程语言,因其简洁的语法和强大的库而备受开发者喜爱。而在Python中,面向对象编程(OOP)是一种核心的编程范式,它通过模拟现实世界中的对象和交互来帮助我们设计清晰、易维护的代码。
在本篇博客中,我们将深入探讨Python的面向对象编程的基本概念,了解如何通过类(class)和对象(object)来组织代码,并掌握继承、封装和多态等面向对象的核心原则。这些概念不仅能帮助我们编写更具可扩展性的代码,还能让我们更容易理解和解决复杂问题。
让我们从最基本的面向对象编程概念开始,逐步带你走向掌握Python OOP的道路
类 class
在面向对象编程(OOP)中,类(class)是创建对象的蓝图或模板。类定义了对象的属性(也叫字段或变量)和行为(也叫方法或函数)。你可以通过类来组织和封装数据与功能,从而使得代码更加模块化、可重用且易于维护。
在Python中,类通过 class 关键字来定义。类中的属性通常由构造方法 init 来初始化,而类中的方法则定义了对象能够执行的操作。通过类,我们可以创建多个对象,每个对象都有自己的属性和方法
class Student:
# 构造方法
def __init__(self, name, age):
self.name = name # 学生姓名
self.age = age # 学生年龄
# 类的方法
def introduce(self):
print(f"大家好,我是{self.name},今年{self.age}岁。")
在这个例子中,Student 是一个类,它有两个属性:name(姓名)和 age(年龄)。通过 init 构造方法,这些属性会在创建对象时进行初始化。此外,introduce 方法则是学生的一个行为,用于输出学生的自我介绍
创建对象
类定义好之后,我们可以通过类创建对象。每个对象都是类的实例,并且会拥有类中定义的属性和方法。
# 创建学生对象
student1 = Student("张三", 20)
# 调用对象的方法
student1.introduce()
执行上述代码后,输出结果将是
大家好,我是张三,今年20岁。
类是面向对象编程的基础,它为我们提供了一个结构化的方式来组织数据和功能。通过定义类,我们可以创建出多个具有相同属性和行为的对象。Python中的类使得代码更具可读性和可维护性,并且能够促进代码的重用
私有属性
在面向对象编程中,私有属性(Private Attributes)是类的属性之一,其设计目的是限制对该属性的直接访问,从而保护数据的封装性和隐私性。在Python中,私有属性并没有强制性的访问控制机制,但我们可以通过约定俗成的命名规则来表示某个属性是私有的。
如何定义私有属性
在Python中,通过在属性名称前加上两个下划线(__)来表示该属性为私有属性。这是Python的命名约定,用于指示该属性是类的内部使用,不应在类的外部直接访问
示例:
class Person:
def __init__(self, name, age):
self.__name = name # 私有属性
self.__age = age # 私有属性
def introduce(self):
print(f"大家好,我是{self.__name},今年{self.__age}岁。")
# 公共方法访问私有属性
def get_name(self):
return self.__name
def get_age(self):
return self.__age
在这个例子中,__name 和 __age 都是私有属性。通过这种方式,外部代码无法直接访问这些属性,而只能通过类中提供的公共方法(如 get_name() 和 get_age())来间接访问。
访问私有属性
如果你尝试在类的外部直接访问私有属性,Python会抛出AttributeError,提示你无法访问该属性。
person = Person("李四", 25)
print(person.__name) # 会抛出错误,AttributeError: 'Person' object has no attribute '__name'
使用公共方法访问私有属性
为了能够访问这些私有属性,我们可以提供公共方法,比如 getter 方法和 setter 方法,用于获取和设置私有属性的值:
print(person.get_name()) # 正常输出:李四
print(person.get_age()) # 正常输出:25
对象的字符串表示形式
def str(self): : 以 字符串的形式 表示对象, 当 使用 str(x) 函数的时候, , 会调用 x 对象的 str 方法完成对象到字符串的转换
def repr(self): : 主要给 打印 print 函数提供调用, 当 print(x) 的时候, 会 自动调用 repr 函数。
class Person:
def __init__(self, *, name=None, sex=None, birth=None):
# 定义属性 并给属性赋值
self.name = name
self.sex = sex
self.__birth = birth
def show(self):
"""显示人的信息"""
print(f"姓名{self.name}, 性别是:{self.sex}, 出生日期是:{self.__birth}")
def __str__(self):
"""该函数的职责 将对象 以 字符串的形式表示、函数必须返回一个字符串、主要给 str()函数实现的。"""
return f"( name={self.name}, sex={self.sex}, birth={self.__birth} )"
def __repr__(self):
"""该函数主要给 print函数提供打印效果"""
return str(self)
property 类
用来 解决 类中的 私有属性 问题 的
class Student:
"""学生类"""
def __init__(self, *, name=None, sex=None, sno=None):
self.__name = name # field 属性
self.__sex = sex
self.__sno = sno
def instruction(self):
"""自我介绍"""
print(f"我叫{self.__name}, 性别是{self.__sex},学号是{self.__sno}")
def get_sno(self):
return self.__sno
def set_sno(self, sno):
"""修改私有属性学号"""
self.__sno = sno
def del_sno(self):
del self.__sno
sno = property(get_sno, set_sno, del_sno)
if __name__ == "__main__":
stu = Student(name="张三")
stu.sno = "10000" # 修改学号,自动调用 set_sno 方法
print(stu.sno) # 获取学号,自动调用 get_sno 方法
property 装饰器
在Python中,property 装饰器提供了一种优雅的方式,允许我们将方法转换为属性访问方式,从而使得在访问类的私有属性时更加灵活和简洁。使用 property 装饰器,我们可以控制对属性的访问,允许我们在获取、设置或删除属性时执行一些额外的操作,而无需直接暴露类的内部实现
class Student:
"""学生类"""
def __init__(self, *, name=None, sex=None, sno=None):
self.__name = name # field 属性
self.__sex = sex
self.__sno = sno
def instruction(self):
"""自我介绍"""
print(f"我叫{self.__name}, 性别是{self.__sex},学号是{self.__sno}")
@property
def sno(self):
return self.__sno
@sno.setter
def sno(self, sno):
"""修改私有属性学号"""
self.__sno = sno
@sno.deleter
def sno(self):
del self.__sno
标签:__,.__,name,python,sno,self,面向对象,属性
From: https://blog.csdn.net/m0_64881179/article/details/143578744