赞
赏
在 Python 中,如果我们既要保护 类 的封装特性,又要让开发者可以使用 “对象.属性” 的方式操作操作 类属性,除了可以使用 property() 函数,Python 还提供了 @property 装饰器。
通过 @property 装饰器,我们可以直接将类的 方法 设置为我们访问类属性的形式,如果我们仅仅使用 @property
修饰类的属性,那么该属性是只读的,不可以被修改。
@property
def funcname(self)
pass
我们使用 @property 定义了一个装饰器 funcname,该装饰器的作用是为 funcname 这个属性提供了 get 方法。
因为这是一个装饰器,因此,我们在调用该方法时,不需要使用 ()
,即我们调用该装饰器的语法为 instance.funcname
而不是 instance.funcname()
。
使用 @property 方法,定义只读装饰器
print("嗨客网(www.haicoder.net)")
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@property
def age(self):
return self.__age
person = Person("haicoder", 18)
print("Person name =", person.name, "age =", person.age)
程序运行后,控制台输出如下:
我们定义了一个 Person 类,类中定义了 构造函数 和一个私有的 __name
属性一个私有的 __age
属性。
接着,我们分别使用 @property
为 name 属性和 age 属性定义了装饰器,这两个装饰器的作用就是直接返回当前私有的 name 属性和私有的 age 属性的值。
最后,我们实例化了一个 Person 类,并直接使用装饰器访问了类的私有属性的值,注意,这里访问装饰器使用的是 person.name
和 person.age
而不是 person.name()
和 person.age()
。我们将程序修改如下:
print("嗨客网(www.haicoder.net)")
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@property
def age(self):
return self.__age
person = Person("haicoder", 18)
print("Person name =", person.name(), "age =", person.age())
程序运行后,控制台输出如下:
我们将程序修改为,使用 person.name()
和 person.age()
的方式访问装饰器,而不是 person.name
和 person.age
,此时程序报错,即我们访问装饰器时,一定不能使用 ()
。我们再次将程序修改如下:
print("嗨客网(www.haicoder.net)")
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@property
def age(self):
return self.__age
person = Person("haicoder", 18)
print("Person name =", person.__name, "age =", person.__age)
程序运行后,控制台输出如下:
我们将程序修改为,使用 person.__name
和 person.__age
的方式访问类属性,此时程序报错,因为我们定义的 __name
和 __age
是私有属性,因此在外部不可以直接访问。我们再次将程序修改如下:
print("嗨客网(www.haicoder.net)")
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@property
def age(self):
return self.__age
person = Person("haicoder", 18)
print("Person name =", person.name, "age =", person.age)
person.name = "HaiCoder"
person.age = 109
print("Person name =", person.name, "age =", person.age)
程序运行后,控制台输出如下:
我们希望通过 person.name
和 person.age
的形式,给实例变量赋值,但此时程序报错,因为我们使用 @property
修饰的属性是只读属性,因此不可以修改属性的值。
在 Python 中,如果我们既要保护类的封装特性,又要让开发者可以使用 “对象.属性” 的方式操作操作类属性,除了可以使用 property() 函数,Python 还提供了 @property 装饰器。
通过 @property 装饰器,我们可以直接将类的方法设置为我们访问类属性的形式,如果我们仅仅使用 @property
修饰类的属性,那么该属性是只读的,不可以被修改。Python @property语法:
@property
def funcname(self)
pass