Python面向对象加强1.关于经典类、新式类和property详解
一、经典类和新式类
经典类: class People: 新式类: class People(object):
**我们所接触到的类,都是新式类。同时,在 Python 2.X 相关的版本中,还存在另外一种称之为 “经典类”的类。**主要区别在于,在 Python 2.X 相关的版本中定义一个类时,默认不继承(object),而在 Python 3.X相关版本中,默认继承(object)。
二、property属性详解
1.关于property属性(装饰器):
一种用起来像是使用的实例属性一样的特殊属性, 可以对应于某个方法,希望能够像调用属性一样来调用方法 此时可以将一个方法加上property 将该函数方法,当做属性,不用()也可以执行。说白了就是用一系列方法做出类似于属性的操作。 说起来可能不太明白,先来看一个常规操作:
class Person(object):
def __init__(self):
self.__age=18
@property
def age(self):
return self.__age
p=Person()
print(p.age)
此时虽然age是一个方法,但是并不需要p.age()这样调用,而是像一个使用属性一样调用(p.age),但是并不能此时做赋值操作,age此时就相当于一个只读属性。
2、property属性的用法
先来看一下python源码中对于property的注释:
"""
Property attribute.
fget
function to be used for getting an attribute value
fset
function to be used for setting an attribute value
fdel
function to be used for del'ing an attribute
doc
docstring
Typical use is to define a managed attribute x:
class C(object):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
Decorators make defining new properties or modifying existing ones easy:
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
"""
重点在于:
class C(object):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
和:
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
可以看出propety有两种应用场景,一种是在类中定义值为property对象的类属性,一种是在方法上应用装饰器 先来说第一种:
应用于类属性
由源码可知 property方法中有个四个参数 第一个参数是方法名,调用 对象.属性 时自动触发执行方法 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法 第四个参数是字符串,调用 对象(类).属性.doc ,此参数是该属性的描述信息
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
def del_age(self):
del self.__age
age = property(get_age, set_age, del_age, "description")
p = Person()
print(p.age)
p.age = 90
print(p.age)
print(p.__dict__)
a = Person.age.__doc__
print(a)
del p.age
try:
print(p.age)
except(AttributeError):
print("age属性已经被删除")
然后是第二种:
在类的实例方法上应用@property装饰器
首先是在经典类(python2.x)中,property只有一种装饰器使用方法
class Person:
__age=18
@property
def age(self):
return Person.__age
p=Person()
a=p.age
print(a)
18
*然后是新式类,具有三种@property装饰器。对于获取、修改、删除分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法,示例如下:
class Person:
def __init__(self):
self.__age=18
@property
def age(self):
return self.__age
@age.setter
def age(self,value):
self.__age=value
@age.deleter
def age(self):
del self.__age
p = Person()
print(p.age)
p.age = 90
print(p.age)
print(p.__dict__)
del p.age
try:
print(p.age)
except(AttributeError):
print("age属性已经被删除")
三、只读属性的三种种设置方法
第一种就是使用property装饰器设置
class Person:
def __init__(self):
self.__age=18
@property
def age(self):
return self.__age
@age.setter
def age(self,value):
self.__age=value
@age.deleter
def age(self):
del self.__age
p = Person()
print(p.age)
p.age = 90
print(p.age)
print(p.__dict__)
del p.age
try:
print(p.age)
except(AttributeError):
print("age属性已经被删除")
第二种是用property方法设置
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
def del_age(self):
del self.__age
age = property(get_age, set_age, del_age, "description")
p = Person()
print(p.age)
p.age = 90
print(p.age)
print(p.__dict__)
a = Person.age.__doc__
print(a)
del p.age
try:
print(p.age)
except(AttributeError):
print("age属性已经被删除")
第三种是 通过定义__setattr__方法实现 __setattr__方法: 当我们通过 实例.属性 = 值,给一个实例增加一个属性,或者说修改一下属性值的时候,都会调用这个方法。在这个方法内部,才会真正的把,整数型,以及对应的数据,给存储到__dict__里面
class Person:
def __setattr__(self, key, value):
print(key,value)
if key =="age" and key in self.__dict__.keys():
print("只读属性不能设置数据。。。")
else:
self.__dict__[key] = value
p=Person()
p.age=20
print(p.age)
p.age=18
p.name='jaing'
print(p.__dict__)
|