sách gpt4 ai đã đi

python - 定义@property

In lại 作者:行者123 更新时间:2023-12-01 04:34:28 27 4
mua khóa gpt4 Nike

我在具体类中使用 @property 定义 getter 时遇到问题。这是Python代码:

from abc import ABCMeta, abstractproperty

class abstract(object):
__metaclass__ = ABCMeta

def __init__(self, value1):
self.v1 = value1

@abstractproperty
def v1(self):
vượt qua

class concrete(abstract):
def __init__(self, value1):
super(concrete, self).__init__(value1)

@property
def v1(self):
return self.v1

然后测试代码并得到此错误:

test_concrete = concrete("test1")
test_concrete.v1

---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
----> 1 test_concrete = concrete("test1")
2 test_concrete.v1

in __init__(self, value1)
11 class concrete(abstract):
12 def __init__(self, value1):
---> 13 super(concrete, self).__init__(value1)
14
15 @property

in __init__(self, value1)
3
4 def __init__(self, value1):
----> 5 self.v1 = value1
6
7 @abstractproperty

AttributeError: can't set attribute

基本上我打算将 v1 设置为只读属性。

我习惯于对属性及其 getter 函数使用相同的名称,但如果该类继承自抽象类,我似乎无法做到这一点。

我找到了一种解决方法,将 getter 函数 v1 使用不同的名称作为 get_v1:

class abstract(object):
__metaclass__ = ABCMeta

def __init__(self, value1):
self.v1 = value1

@abstractproperty
def get_v1(self):
vượt qua

class concrete(abstract):
def __init__(self, value1):
super(concrete, self).__init__(value1)

@property
def get_v1(self):
return self.v1

这个问题有更好的解决方法吗?

1 Câu trả lời

您的问题与抽象类无关。这是一个命名空间问题;属性对象和实例属性占用相同的命名空间,实例属性和属性不能同时使用完全相同的名称。

您正在尝试使用 self.v1 = ... 访问属性,并且 v1 并不是神奇的实例属性,只是因为您通过实例上的方法访问它,该方法始终将是属性对象。

同样,你的属性 getter 将导致无限循环:

@property
def v1(self):
return self.v1

bởi vì self.v1 Đúng属性对象,而不是实例属性。

对实际存储使用不同的名称:

def __init__(self, value1):
self._v1 = value1

@property
def v1(self):
return self._v1

请注意,在 Python 中不能拥有真正的私有(private)属性(就像在 C# 或 Java 中一样);名称上的前导下划线只是一种约定,坚定的编码人员始终可以直接访问您的实例状态。 property 对象不会改变这一点。

关于python - 定义@property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31961914/

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com