python私有属性怎么定义_Python 类中私有属性读取和修改方法

先看下面代码:

class Movie(object):

def __init__(self, name, year):

self.name = name

self.year = year

def print_detail(self):

print("Name is {}, year is {}".format(self.name, self.year))

movie = Movie("囧妈", 2020)

print(movie.name) # 囧妈

movie.name = "流浪地球"

print(movie.name) # 流浪地球

看到创建的两个属性和一个方法都被暴露在外面,可被 movie 调用。这样的话,这些属性就会被任意修改(电影名称由 【囧妈】变为【流浪地球】)。

如果想避免属性 name 被修改,可以将它变为私有变量。改动方法:属性前加 2 个 _ 后,变为私有属性。如:

class Movie(object):

def __init__(self, name, year):

self.__name = name

self.__year = year

def print_detail(self):

print("Name is {}, year is {}".format(self.__name, self.__year))

movie = Movie("囧妈", 2020)

movie.print_detail()

print(movie.__name) # 囧妈

结果显示:

Name is 囧妈, year is 2020

...

AttributeError: 'Movie' object has no attribute '__name'

但是这样改动后,属性 name 不能被访问了,也就无法得知 movie 的名字叫啥。不过,这个问题有一种简单的解决方法,直接新定义一个方法就行:

def get_name(self):

return self.__name

综合代码如下:

class Movie(object):

def __init__(self, name, year):

self.__name = name

self.__year = year

def print_detail(self):

print("Name is {}, year is {}".format(self.__name, self.__year))

def get_name(self):

return self.__name

movie = Movie("囧妈", 2020)

movie.print_detail()

print(movie.get_name()) # 囧妈

下面,通过另一个例子,解释如何更优雅地改变某个属性为只读或只写。

使用 Python 自带的 property 类,就会优雅地将 name 变为只读的。

@property

def name(self):

return self.__name

完整代码如下:

class Movie(object):

def __init__(self, name, year):

self.__name = name

self.__year = year

def print_detail(self):

print("Name is {}, year is {}".format(self.__name, self.__year))

@property

def name(self):

return self.__name

movie = Movie("囧妈", 2020)

movie.print_detail()

print(movie.name) # 囧妈

#movie.name = "流浪地球"

如果再尝试使用

movie.name = "流浪地球"

修改 name 属性时,会报如下错误:

Traceback (most recent call last):

movie.name = "流浪地球"

AttributeError: can't set attribute

使用 @property 装饰后 name 变为属性,意味着 .name 就会返回电影的名字,而不是通过 .get_name() 这种函数调用的方法。这样变为真正的属性后,可读性更好。

如果使 name 既可读又可写,就再增加一个装饰器 @name.setter。

class Movie(object):

def __init__(self, name, year):

self.__name = name

self.__year = year

@property

def name(self):

return self.__name

@name.setter

def name(self, new_name):

self.__name = new_name

movie = Movie("囧妈", 2020)

print(movie.name) # 囧妈

movie.name = "流浪地球"

print(movie.name) # 流浪地球

注意这种装饰器写法:name.setter,name 已经被包装为 property 实例,调用实例上的 setter 函数再包装 name 后就会可写。

标签:.__,读取,Python,movie,self,year,print,类中,name

来源: https://blog.csdn.net/wohu1104/article/details/104460315

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值