‘爬穷’--面向对象-封装与property

封装是面向对象三大特征之一,另外两个是继承与多态
封装的顾名思义就是把类封闭包装那样理解。方便调用或者说使用、运用。
出现封装的原因:我们需要⼀种⽅式来增强数据的安全性

  1. 属性不能随意修改 2. 属性不能改为任意的值
  2. 封装是指隐藏对象中⼀些不希望被外部所访问到的属性或⽅法
    我们也可以提供给⼀个getter()和setter()⽅法是外部可以访问到属性 getter() 获取对象中指定的属性 setter() ⽤来设置对象指定的属性 使⽤封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全
  3. 隐藏属性名,使调⽤这⽆法随意的修改对象中的属性 2. 增加了getter()和setter()⽅法,很好控制属性是否是只读的 3. 使⽤setter()设置属性,可以在呢及数据的验证 4. 使⽤getter()⽅法获取属性,使⽤setter()⽅法设置属性可以在读取属 性和修改属性的同时做⼀些其他的处理
    可以为对象的属性使⽤双下划线开头 __xxx。双下划线开头的属性,是对象 的隐藏属性,隐藏属性只能在类的内部访问,⽆法通过对象访问
    其实隐藏属性只不过是Python⾃动为属性改了⼀个名字 --> _类名__属性 名 例如 __name -> _Person__name 这种⽅式实际上依然可以在外部访问,所以这种⽅式我们⼀般不⽤。⼀般我
    们会将⼀些私有属性以_开头 ⼀般情况下,使⽤_开头的属性都是私有属性,没有特殊情况下不要修改私有属性
    实例:

#定义一个类,鱼
class fish:
def init(self,name,color,age):
self.hidd_name=name #名字
self.hidd_color=color #颜色
self.hidd_age=age #年龄
def move(self):

    print('我是一条%s的鱼,我可以在水中游!'%self.hidd_color)
def get_name(self):
    print('我的名字是:')
    return self.hidd_name

# get_name()用来获取对象的name属性

def set_age(self,age):
    print('修改了年龄,我长大了一岁')
    if age>2:
        self.hidd_age=age

def infomationg(self):
    print('我的名字是:%s,我的年龄是%s岁,我的颜色是%s'%(self.hidd_name,self.hidd_age,self.hidd_color))

f=fish(‘金鱼’,‘金色’,3)
f.move()
#print(f.move())
print(f.get_name())
f.set_age(4)
f.get_name()
f.infomationg()
在这里插入图片描述
实例2:
class water:
def init(self,watername,mounth):
self._watername=watername
self._mou=mounth

def watern(self):
    print('getter 方法执行')
    print(self._watername)

    return self._watername

def waternww(self,watername):
    self._watername=watername

w=water(‘农夫山泉’,3)
#g=w.waterna()
w.watern()
w.waternww(‘昆仑山’)
w.watern()
#w.waterna()
输出结果:
getter 方法执行
农夫山泉
getter 方法执行
昆仑山

property装饰器,个人认为是为了更好地封装
可以使⽤@property装饰器来创建只读属性,@property装饰器会将⽅ 法转换为相同名称的只读属性,可以与所定义的属性配合使⽤,这样可以防⽌
属性被修改
实例:
class water:
def init(self,watername,mounth):
self._watername=watername
self._mou=mounth
# property装饰器 用来将一个方法转换为对象的属性

@property
def watern(self):
    print('getter 方法执行')
    print(self._watername,self._mou)

    return self._watername
# setter方法的装饰器 @属性名.setter
@watern.setter
def waternww(self,watername):
    self._watername=watername

w=water(‘农夫山泉’,3)

#g=w.waterna() # w.watern() # w.waternww(‘昆仑山’) # w.watern()

print(w.watern)
w.waternww=‘龙井’
print(w.watern

输出结果:
getter 方法执行
农夫山泉 3
农夫山泉
getter 方法执行
龙井 3
龙井

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值