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

本文来自企鹅号 - 乐想屋媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏转载gongluck的CSDN博客

C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:   int a=88;   int b=a;   而类对象与普通对象不同,类对象...

2917
来自专栏CDA数据分析师

陷阱!python参数默认值

在stackoverflow上看到这样一个程序: class demo_list: def __init__(self, l=[]): ...

2138
来自专栏锦小年的博客

python学习笔记4.2-python高级之迭代器

迭代是Python中最强有力的特性之一,同时对编程人员来说,也是最难理解的一种用法。其实从高层次来看,迭代就是一种处理序列中元素的方式。通过自定义迭代对象可以...

21010
来自专栏程序生活

Python itertools的使用简介无限迭代器chain方法

用*放在一个可迭代对象前面可以将对象拆分成多个单元素,比如first=[['1','2','3','4','4'],['2','4','2']],如果把*放在f...

721
来自专栏Golang语言社区

[基础篇]Go语言变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。 Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。 声...

3787
来自专栏JetpropelledSnake

Python入门之迭代器/生成器/yield的表达方式/面向过程编程

 本章内容     迭代器     面向过程编程       一、什么是迭代       二、什么是迭代器       三、迭代器演示和举例       四、生...

2919
来自专栏信安之路

php 弱类型问题

php 是一门简单而强大的语言,提供了很多 Web 适用的语言特性,其中就包括了变量弱类型,在弱类型机制下,你能够给一个变量赋任意类型的值。

1400
来自专栏猿人谷

Java初学者需掌握的30个概念

基本概念:       1.OOP中唯一关心的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道c...

17010
来自专栏互联网技术栈

JVM解读-方法区

方法区,Method Area, 对于习惯在HotSpot虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”(Permanent Genera...

2064
来自专栏怀英的自我修炼

Java漫谈9

上次聊String的时候聊到了String为什么可以在不new的情况下创建,说实话,这个问题我也没有答案,直到看到了这篇帖子,才敢说知道了为什么。 《Java ...

3649

扫码关注云+社区

领取腾讯云代金券