Python笔记(十八)_私有属性、实例属性、类属性

私有属性

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改。

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

那如果想让外部代码获取私有属性该怎么办?

修改内部代码:可以给类增加访问方法(return self.__name)和修改方法(self.__score=score)

class Student(object):
  def get_name(self):
    return self.__name

 

class Student(object):
  def set_score(self, score):
    self.__score = score

从外部直接调用:不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,其实仍然可以通过bart.__Student__name来访问私有属性(不推荐使用)

 

实例属性

方法一:通过实例变量绑定(只对绑定的实例起作用)

class Student():

  pass

>>>bart=Student()

可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:

>>> bart.name = 'Bart Simpson'

>>> bart.name

'Bart Simpson'

 

方法二:通过self变量绑定(所有实例都起作用)

由于类可以起到模板的作用,因此可以在创建类的时候,通过定义一个特殊的__init__方法,把一些我们认为必须绑定的属性强制填写进去

class Student(object):

  def __init__(self, name, score):

    self.name = name

    self.score = score

注意:__init__方法的第一个参数永远是self,表示创建的实例本身;因此在__init__方法内部,就可以把各种属性绑定到self,也就是绑定到实例,因为self就指向创建的实例本身。

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数

 

给实例限定属性

定义一个特殊的__slots__变量,来限制该class实例能添加的属性

class Student(object):

  __slots__ = ('name', 'age')

>>> s = Student()

>>> s.score = 99     #报错

注意:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义一个__slots__

 

类属性

给类绑定属性:直接在class中定义即可

class Student():

 name='demi'

定义好的name即为类属性,这个属性虽然归类所有,但类的所有实例都可以访问

>>> s = Student()

>>> print(s.name)

demi

或者

>>> Student.name

demi

 

注意:

实例属性属于各个实例所有,互不干扰

类属性属于类所有,所有实例都可共用

不要对实例属性和类属性使用相同的名字,否则实例属性将屏蔽掉类属性

不要对属性和方法使用相同的名字,否则属性会覆盖方法

class C:

        def x(self):

                print('Xman')

>>> c = C()

>>> c.x()

Xman

>>> c.x = 1

>>> c.x()     #报错,属性与方法重名了

转载于:https://www.cnblogs.com/demilisi/p/11048109.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值