python如何对一个属性或方法进行封装_python杂谈:面向对象-属性封装

python是弱类型语言,在操作的过程中,封装是面向对象实现的一种语法糖

更多的是项目规范的体现#

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面向对象中属性的封装操作就暂时先聊到这里了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值