python使用@property @x.setter @x.deleter

@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。

1》只有@property表示只读。

2》同时有@property和@x.setter表示可读可写。

3》同时有@property和@x.setter和@x.deleter表示可读可写可删除。

class student(object): #新式类
def __init__(self,id):
self.__id=id
@property #读
def score(self):
return self._score
@score.setter #写
def score(self,value):
if not isinstance(value,int):
raise ValueError(‘score must be an integer!‘)
if value<0 or value>100:
raise ValueError(‘score must between 0 and 100‘)
self._score=value
@property #读(只能读,不能写)
def get_id(self):
return self.__id 

s=student(‘123456‘)
s.score=60 #写
print s.score #读
#s.score=-2 #ValueError: score must between 0 and 100
#s.score=32.6 #ValueError: score must be an integer!
s.score=100 #写
print s.score #读
print s.get_id #读(只能读,不可写)
#s.get_id=456 #只能读,不可写:AttributeError: can‘t set attribute

运行结果:

60

100

123456

class A(object):#新式类(继承自object类)
    def __init__(self):
        self.__name=None
    def getName(self):
        return self.__name
    def setName(self,value):
        self.__name=value
    def delName(self):
        del self.__name
    name=property(getName,setName,delName)

a=A()
print a.name #读
a.name=‘python‘ #写
print a.name #读
del a.name #删除
#print a.name #a.name已经被删除 AttributeError: ‘A‘ object has no attribute ‘_A__name‘

运行结果:

None

python

class A(object):#要求继承object
    def __init__(self):
        self.__name=None

    #下面开始定义属性,3个函数的名字要一样!
    @property #读
    def name(self):
        return self.__name
    @name.setter #写
    def name(self,value):
        self.__name=value
    @name.deleter #删除
    def name(self):
        del self.__name

a=A()
print a.name #读
a.name=‘python‘  #写
print a.name #读
del a.name #删除
#print a.name # a.name已经被删除 AttributeError: ‘A‘ object has no attribute ‘_A__name‘  

运行结果:
None
python

class person(object):
    def __init__(self,first_name,last_name):
        self.first_name=first_name
        self.last_name=last_name
    @property #读
    def full_name(self):
        return ‘%s %s‘ % (self.first_name,self.last_name) 

p=person(‘wu‘,‘song‘)
print p.full_name #读
#p.full_name=‘song ming‘ #只读,不可修改  AttributeError: can‘t set attribute
p.first_name=‘zhang‘
print p.full_name #读

运行结果:

wu song

zhang song

上面都是以新式类为例子,下面我们看一个包含经典类的例子:

#!/usr/bin/env python
#coding:utf-8

class test1:#经典类:没有继承object
    def __init__(self):
        self.__private=‘alex 1‘ #私有属性以2个下划线开头
    #读私有属性
    @property
    def private(self):
        return self.__private
    #尝试去写私有属性(对于经典类而言,“写”是做不到的,注意看后边的代码和注释!)
    @private.setter
    def private(self,value):
        self.__private=value
    #尝试去删除私有属性(对于经典类而言,“删除”也是做不到的,具体看后边的代码和注释!)
    @private.deleter
    def private(self):
        del self.__private  

class test2(object):#新式类:继承了object
    def __init__(self):
        self.__private=‘alex 2‘ #私有属性以2个下划线开头
    #读私有属性
    @property
    def private(self):
        return self.__private
    #写私有属性
    @private.setter
    def private(self,value):
        self.__private=value
    #删除私有属性
    @private.deleter
    def private(self):
        del self.__private  

t1=test1()
#print t1.__private #外界不可直接访问私有属性
print t1.private #读私有属性
print t1.__dict__
t1.private=‘change 1‘ #对于经典类来说,该语句实际上是为实例t1添加了一个实例变量private
print t1.__dict__
print t1.private #输出刚刚添加的实例变量private
t1.private=‘change 2‘
print t1.__dict__
del t1.private #删除刚刚添加的实例变量private
print t1.__dict__
print t1.private #读私有属性
#del t1.private #无法通过这种方式删除私有属性:AttributeError: test1 instance has no attribute ‘private‘
#对于经典类而言,我们无法通过上面的语句,对实例的私有变量__private进行修改或删除!
print ‘-------------------------------------------------------‘
t2=test2()
print t2.__dict__
print t2.private #继承了object,添加@private.setter后,才可以写
t2.private=‘change 2‘ #修改私有属性
print t2.__dict__
print t2.private
del t2.private #删除私有变量
#print t2.private #私有变量已经被删除,执行“读”操作会报错:AttributeError: ‘test2‘ object has no attribute ‘_test2__private‘
print t2.__dict__
#对于新式类而言,我们可以通过上面的语句,对实例的私有变量__private进行修改或删除  

运行结果: 

alex 1

{‘_test1__private‘: ‘alex 1‘}

{‘_test1__private‘: ‘alex 1‘, ‘private‘: ‘change 1‘}

change 1

{‘_test1__private‘: ‘alex 1‘, ‘private‘: ‘change 2‘}

{‘_test1__private‘: ‘alex 1‘}

alex 1

-------------------------------------------------------

{‘_test2__private‘: ‘alex 2‘}

alex 2

{‘_test2__private‘: ‘change 2‘}

change 2

{}

---------------------

本文来自 快递小可 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sxingming/article/details/52916249?utm_source=copy

原文地址:https://www.cnblogs.com/anzhangjun/p/9743691.html

时间: 2024-11-06 09:36:54

python使用@property @x.setter @x.deleter的相关文章

python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod

看到一篇很赞的博客,转载收藏! 侵删! http://blog.csdn.net/u013210620/article/details/78604077?locationNum=9&fps=1 原文地址:https://www.cnblogs.com/CongYuUestcer/p/8343693.html

面向对象:property、setter、deleter

property:是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 一个静态属性property本质就是实现了get,set,delete三种方法 例:在不改变对象调用属性名的方式(obj.name)下,实现了被封装属性在类外部的查看.修改.删除 class Person: def __init__(self,name,money): self.__name = name self.__money = money @property #查看 def name(self): return

python中@property的作用和getter setter的解释

@property作用: python的@property是python的一种装饰器,是用来修饰方法的. 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改. 1.修饰方法,让方法可以像属性一样访问. class DataSet(object): @property def method_with_property(self): ##含有@property return 15 def m

python特性property

通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道.若果要规范这些访问和设值方式的话, 一种方法是数据描述符,另一种就是python内置的数据描述符协议函数Property().property是一种特殊的值,访问它时会计算它的值. 特性的原型函数是property(getf=None,setf=None,delf=None,doc=None),函数的前三个参数分别对应描述符的__get__.__set__.__delete__方法. class

Python中property属性详解

1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ############### class Foo: def func(self): pass # 定义property属性 @property def prop(self): pass # ############### 调用 ############### foo_obj = Foo() foo_obj.func() # 调用实例方法 foo_obj.p

【转】python之property属性

1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ############### class Foo: def func(self): pass # 定义property属性 @property def prop(self): pass # ############### 调用 ############### foo_obj = Foo() foo_obj.func() # 调用实例方法 foo_obj.p

python中@property的使用

python中@property的使用 @property的作用是把一个getter方法变成属性,@xxx.setter把setter方法变成属性赋值. #coding:utf-8 class Screen(object): @property def width(self): return self._width @width.setter def width(self,value): if not isinstance(value,int): raise ValueError('width

python 使用@property

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: class Student(object): def get_score(self): return self._score def set_s

python之property、类方法和静态方法

一.完整的property1.定义一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,增加和修改就对应着被setter装饰的方法,删除一个属性对应着被deleter装饰的方法. @property:把方法伪装成属性 @被property装饰的方法名.setter:当被property装饰的方法,又实现了一个同名方法,且被setter装饰器装饰了,那么在对被装饰的方法赋值的时候,就会触发被setter装饰器装饰的方法,这个方法必须要传一个参数接收等号后面的值,是用来保护一个变量在修改的时