首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python面向对象4:属性、成员修饰符

1、属性:

+@property的函数,具有属性,可以直接取值。属性具有方法的写作形式,同时具有字段的访问形式,访问时不需要加()。

案例1:不加属性的调用普通方法,需要方法+()

classpager:

def__init__(self,totalcnt):

self.totalcnt=totalcnt

defallpage(self):#普通方法#10个一分页

a1,a2=divmod(self.totalcnt,10)

ifa2==:

returna1

else:

t=a1+1

returnstr(t)

#创建对象并执行

obj=pager(95)

print('调用普通字段,总页数:',obj.totalcnt)

print('调用普通方法,分页数:',obj.allpage())#方法+()

执行结果:

案例2:加属性的调用,只需要方法即可,不需要()

classpager:

def__init__(self,totalcnt):

self.totalcnt=totalcnt

@property# 加属性

defallpage(self):

a1,a2=divmod(self.totalcnt,10)

ifa2==:

returna1

else:

t=a1+1

returnstr(t)

#创建对象并执行

obj=pager(95)

print('调用普通字段,总页数:',obj.totalcnt)

print('调用属性的方式,分页数:',obj.allpage)#此处无方法+()

执行结果:

案例3:如果要更改赋值,比如设置新的数,或者执行删除方法,需要使用其他的装饰器。

函数名+setter,重新设置新的值

函数名+deleter,可以设置成删除方法,并不一定是真的删除,也可以伪造成其他的方法

classpager:

def__init__(self,totalcnt):

self.totalcnt=totalcnt

@property# 加属性,取值

defall_pager(self):#10个一分页

a1,a2=divmod(self.totalcnt,10)

ifa2==:

returna1

else:

returna1+1

@all_pager.setter#重新设置新的值,格式为原方法+setter

defall_pager(self,value):

print("重新设置")

@all_pager.deleter#删除,格式为原方法+deleter

defall_pager(self):

print("del value")

#实例化

obj=pager(95)

print('-------使用属性直接取值---------')

print(obj.all_pager)#此处无方法+()

print('-------设置新的值---------')

obj.totalcnt=113#修改一下值,使用allpage.setter

print(obj.all_pager)#打印新的值

print('-------可以删除,也可以伪造成其他的形式,比如打印---------')

delobj.all_pager

执行结果:

2、成员修饰符

成员修饰符,公有的、私有的。私有的只能在内部访问,外部无法访问。

类成员有:字段、方法、属性;

案例1:公有字段的访问途径:一是直接打印字段,一是通过方法。

classc1:

def__init__(self,name):

self.name=name

deff1(self):

print(self.name)

obj=c1('hh')

print('途径1,直接打印name:',obj.name)

print('途径22,通过方法实现打印name')

obj.f1()

执行结果:

案例2:创建类中的私有动态字段;

字段前加两个下划线,比如__XXX,表示的是私有类型(private)的变量;

访问时,只能通过方法访问

私有字段只能允许这个类本身进行访问, 连子类也不可以。

classfoo:

def__init__(self,value):

self.__value=value#私有字段

deff1(self):#10个一分页

print(self.__value)

#定义对象

obj=foo(95)

#访问私有字段

obj.f1()#可以通过方法调用

但不能像公有字段一样,通过print(obj.value)访问

如果实在想强制访问,也可用print(obj._foo__value),类名前面死一个下划线,字段名前是俩下划线,下划线为英文状态的。

即使继承也无法访问,比如obj.f2()是不能访问下面的例子的

classfoo:

def__init__(self,value):

self.__value=value

deff1(self):#10个一分页

print(self.__value)

classbar(foo):#集成foo类,

deff2(self):

print(self.__value)#无法继承foo的私有字段

obj=bar(95)#创建对象

obj.f1()#可以通过方法调用,而不能通过obj.f2()访问

案例3:创建类中的私有静态字段。

可以通过对象的方法访问

classfoo:

__coo="gtt"#静态私有字段

def__init__(self,value):

self.__value=value

deff1(self):

print(self.__value)

deff2(self):

print(foo.__coo)#静态私有字段

obj=foo("123")

obj.f2()#通过普通方法访问

通过静态方法访问

classfoo:

__coo="gtt"#静态私有字段

def__init__(self,value):

self.__value=value

deff1(self):

print(self.__value)

@staticmethod

deff2():

print(foo.__coo)#静态私有字段

foo.f2()

案例4:受保护的变量

_xxx,单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量。这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。

classStudent:

def__init__(self, name, age):

self._name = name#一个下划线定义

self.age=age

stu=Student('hh','30')#实例化

print(stu._name)#受保护的变量访问

print(stu.age)

执行结果:

案例链接:https://pan.baidu.com/s/1miGcPRE 密码:uwi8

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171224G0MUU500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券