更多的是项目规范的体现#
1. 类型中属性的操作class Person:
def __init__(self, name, age):
# 普通属性操作
self.name = name
self.age = age
p = Person("tom", 18)
print(p.name, p.age)
p.name = "老王"
p.age = 1800 # 正确,但是不合法
对象的普通属性可以直接操作,操作数据赋值不会造成语法问题,但是不符合项目规范
2. 类型中属性的操作——方法限制项目中有一种规范:一个下划线开头的属性规定为私有属性,外界不允许直接访问,而是通过提供的操作函数进行操作
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
def get_name(self):
return self._name
def set_name(self, name)
self._name = name
def get_age(self):
return self._name
def set_age(self, age):
if 0 <= age <= 100:
self._age = age
else:
print("年龄不合法")
p = Person("tom", 19)
# 通过方法调用属性的数据
print(p.get_name(), p.get_age())
# 通过方法给属性赋值
p.set_name("jerry")
p.set_age(120) # 年龄不合法
# 但是这样的封装,只是项目规范上的封装,并不能真正将属性封装隐藏起来
print(p._name, p._age) # 也可以访问得到数据
p._name = "shuke"
p._age = 200
3. 类型中属性操作——私有化
python中还提供了一种私有化操作,将属性或者方法前面添加两个下划线,让属性和方法不能被外界直接访问,是强制私有化语法的操作
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
p = Person("tom", 18)
# 正常通过方法操作属性
print(p.get_name(), p.get_age())
# 通过方法设置属性值
p.set_name("jerry")
p.set_age(20)
# 注意1:这样的情况下不再允许直接操作属性
print(p.__name) # 这是错误的 Person object has no attribute '__name'
# 注意2:但是即使是语法强制私有化,还是可以通过特殊的语法格式直接访问
print(p._Person__name) # 同样访问到了私有属性的数据
p._Person__age = 200 # 同样也是可以给私有属性进行赋值操作
# 但是一般不建议这样操作,满足项目规范的前提下正常封装开发即可
4. 类型中的属性操作——注解支持属性还原
python在发展的过程中,也出现了一些隐藏底层实现的操作方式,将属性操作方法的实现封装在内部
外部直接通过属性名称操作,但是实际上是通过方法进行的实现
class Person:
def __init__(self, name):
self.__name = naem
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
p = Person("tom")
p.name = "jerry" # 合法操作,实际上调用了name(self, name)函数设置数据
print(p.name) # 合法操作,实际上调用name(self)函数获取数据
5. 类型中的属性操作——限制访问
python提供了更加人性化的操作,可以通过限制方式完成只读、只写、读写、删除等各种操作
class Person:
def __init__(self, name):
self.__name = name
def __get_name(self):
return self.__name
def __set_name(self, name)
self.__name = name
def __del_name(self):
del self.__name
# property()中定义了读取、赋值、删除的操作
# name = property(__get_name, __set_name, __del_name)
name = property(__get_name, __set_name)
p = Person("tom")
print(p.name) # 合法:调用__get_name
p.name = "jerry" # 合法:调用__set_name
print(p.name)
# property中没有添加__del_name函数,所以不能删除指定的属性
del p.name # 错误:AttributeError: can't delete Attribute
好啦,python面向对象中属性的封装操作就暂时先聊到这里了...