gpt4 book ai didi

python - 可读属性方法和仅像属性一样返回数据的可调用函数有什么区别?

转载 作者:行者123 更新时间:2023-12-01 07:16:16 25 4
gpt4 key购买 nike

我有一个属性,它返回其中包含“ash”的名称列表

class BaseClass(object):
def __init__(self):
self.filter_key = ""
self.name = ""

def filter_names(self, filter_key):
self.filter_key = filter_key

@property
def student_names(self):
return self.names

def callable_function_names(self):
return names

然后是继承BaseClass的学生类

class StudentClass(BaseClass):

@property
def student_names(self):
names = super(StudentClass, self).student_names
return [name for name in names if self.filter_students in name]

@property
def filter_key(self):
"""Gets """
return self.filter_key

@slot_key.setter
def filter_key(self, key):
"""Sets name filter"""
self.filter_names(key)

# or by doing :

def callable_function_names(self):
names = super(StudentClass, self).callable_function_names()
return [name for name in names if self.filter_students in name]

因此,如果我创建学生类(class)的 obj。

studentclsObj = StudentClass()
studentclsObj.filter_key = "ash"

print studentclsObj.student_names
print studentclsObj.callable_function_names()

我可以使用上述两种打印获得相同的结果,有什么区别以及首选和正确的方法是什么?

最佳答案

属性的一个用例不会破坏 API。在我看来,这是 python 的主要优势之一。您可以采用一个函数,将其转换为可调用对象,添加新功能而不破坏旧代码,现在是属性

我看到属性相对于属性的三个主要用途,

只读属性

使用属性可以轻松创建只读属性。它们不冗长、自记录且简单

class Foo:
def __init__(self, bar):
self._bar = bar

@property
def bar(self):
return self._bar

验证可写属性

class Foo:
def __init__(self, bar):
self._bar = bar

@property
def bar(self):
return self._bar

@bar.setter
def bar(self, val):
if valid(val):
self._bar = val

这是一种防御性编程

保持 API 兼容性

假设您有一个银行帐户类,其中平衡属性

class BankAccount:
def __init__(self):
self.balance = 0

你有这段代码并且它工作得很好。但了解你的客户说,我需要你记录每次余额查询。您可以更换属性的属性而不破坏旧代码

class BankAccount:
def __init__(self):
self._balance = 0

@property
def balance(self):
self.log_balance_read()
return self._balance

返回相同值的属性和方法之间没有区别。选择更简单的方法,使用方法来执行操作和状态更改,使用属性来执行真实属性,如果您需要为属性查找添加逻辑,Python 会让您这样做

关于python - 可读属性方法和仅像属性一样返回数据的可调用函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57928197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com