欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力
对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。
专栏:
文章概述:对Python封装的介绍
关键词:Python封装
本文目录:
Python封装
封装(Encapsulation)
封装是面向对象编程的重要概念,它指的是将数据(属性)和操作数据的方法(方法)捆绑在一起,以保护数据不受外部直接访问和修改,而是通过类的方法来间接访问和修改数据。
静态方法(Static Methods)
静态方法属于类而不是实例,因此可以通过类名直接调用,无需创建类的实例。它通常用于那些不需要访问实例或类状态的方法。
class Person:
def __init__(self, name, age, gender):
# 私有变量,添加两个下划线
self.__name = name
self.__age = age
self.__gender = gender
#添加注解,表示是属性(getter 方法)
@property
def Name(self):
return self.__name
#添加注解,两个函数的名字相同(在Python中两个函数如果名字相同的话,
#那么后面那个函数就会将前面的定义的函数替换掉)添加注解方法名加.setter
#使用者封装的优势就体现出来了,可以对输入的值进行进一步的检测,符合的才允许修改
@Name.setter
def Name(self, value):
if value == 'Bob':
pass
else:
self.__name = value
#静态方法也是加注释就行了,静态方法的优势就是可以不用实例化对象就可以直接用类名加方法名的方式直接调用
#这种静态方法不需要像其他动态方法一样,还需要传入self
@staticmethod
def mymethod():
print("Hello World")
Person.mymethod()
#实例化对象:
p1 = Person('yasaka', 18, 'male')
#由于添加了属性(getter)注释,可以把这个Name函数直接当成属性使用,用类名加.属性的方式调用
print(p1.Name)
#将返回的'yasaka'替换成 'Bob'
p1.Name = 'Bob'
print(p1.Name)
#如果不添加这种setter方法直接用赋值的方法,那么就相当于将current_name这个指针的方向指向了Bob
# current_name = p1.Name()
# current_name = 'Bob'
# print(current_name)
# print(p1.Name())
# p1.name = 'Bob'
# print(p1.name)
#静态方法的运用
class MathOperations:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def subtract(a, b):
return a - b
@staticmethod
def multiply(a, b):
return a * b
@staticmethod
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
# 调用静态方法,无需实例化类
print(MathOperations.add(10, 5)) # 输出: 15
print(MathOperations.subtract(10, 5)) # 输出: 5
print(MathOperations.multiply(10, 5)) # 输出: 50
print(MathOperations.divide(10, 5)) # 输出: 2.0
1. 属性装饰器 @property
@property
def Name(self):
return self.__name
- 作用:将
Name
方法转换为一个属性,使得可以通过p1.Name
的形式来访问__name
的值。 - 优势:在外部代码中,可以将方法调用的方式转换为属性访问的方式,更符合面向对象编程的习惯,并提高了代码的可读性。
2. 属性 setter 方法
@Name.setter
def Name(self, value):
if value == 'Bob':
pass
else:
self.__name = value
- 作用:通过
@Name.setter
装饰器,定义了一个 setter 方法,用于设置Name
属性的值。 - 优势:可以在设置属性值时进行额外的逻辑判断或处理。在这个例子中,如果尝试设置
Name
属性为'Bob'
以外的值,会将__name
的值修改为新的值。
定义静态方法
@staticmethod
def mymethod():
print("Hello World")
- 作用:定义了一个静态方法
mymethod
,它与类相关联,而不是与实例相关联。 - 优势:可以在不创建类的实例的情况下,直接使用类名调用这个方法。这样的方法对于那些不需要访问实例属性或类属性的独立功能非常有用。
总结:
- 属性封装:通过
@property
和@Name.setter
实现对Person
类的Name
属性的封装,控制了对__name
的访问和修改方式,增强了代码的安全性和可维护性。 - 静态方法:在
MathOperations
类中定义了几个静态方法,可以直接通过类名调用,而不需要创建类的实例。这种方式适用于那些独立于类实例状态,但与类相关联的功能。