相关疑难解决方法(0)

Python中的不可变对象,可以有弱引用

我一直在继承tuple或使用namedtuple幸福几年,但现在我有一个用例,我需要一个可以用作弱指示物的类.今天我学会了tuple不支持弱引用.

是否有另一种方法可以在Python中使用一组固定的属性创建不可变对象?我不需要元组的数字索引或可变宽度.

class SimpleThingWithMethods(object):
    def __init__(self, n, x):
        # I just need to store n and x as read-only attributes 
    ... ??? ...
Run Code Online (Sandbox Code Playgroud)

我想这引起了一个明显的问题:为什么不可改变; "Pythonic"代码通常只是假设我们都是这里的成年人,如果它有可能破坏类不变量,那么没有一个心智正常的人会进入一个阶级并且使用它的值.在我的情况下,我在库中有一个类,我担心最终用户意外修改对象.我工作的人有时会对我的代码做出错误的假设并开始做我没想到的事情,所以如果我不小心修改我的代码就会引发错误,那就更清晰了.

我不太担心防弹不变性; 如果某个人真的是邪恶的想要修改的东西,那么,好吧,他们是独立的.我只想让你不小心修改我的对象.

python oop tuples python-2.7

10
推荐指数
1
解决办法
293
查看次数

如何限制Python类上可用的属性

参加以下课程

class Person(object):

def __init__(self, first_name, last_name):
    self.first_name = first_name
    self.last_name = last_name
Run Code Online (Sandbox Code Playgroud)

如何防止以下使用?

p1 = Person('Foo', 'Bar')
p1.firstname='Fooooooo'
Run Code Online (Sandbox Code Playgroud)

上面的代码将在Python中成功执行,但是,使用属性的名称进行了错误,即它_first和之间缺失name

更新:这听起来像"猴子修补",我为什么要这样做?

我的目的是简单地帮助避免用户设置错误的属性,让代码执行,并看到意外的行为,而不是立即意识到错误.

Pythonic的推荐方式是什么?

python

7
推荐指数
1
解决办法
2252
查看次数

如何使类的特定实例不可变?

拥有类 C 的实例 c,我想让 c 不可变,但 C 的其他实例不必这样做。

有没有一种简单的方法可以在 python 中实现这一点?

python

5
推荐指数
1
解决办法
100
查看次数

如何在python中使类不可变?

我在这里阅读了很多关于这个主题的内容,但我仍然找不到合适的答案。我有一个类:

class A(object):

    def __init__(self, first, second):
        self.first = first
        self.second = second

    def __eq__(self, other):
        return ****

    def __str__(self):
        return *****

    def __repr__(self):
        return **** 

a = A("a", "b")
Run Code Online (Sandbox Code Playgroud)

例如,我如何禁止 a.first = "c" ?

python class immutability

4
推荐指数
2
解决办法
3123
查看次数

使用__new __()在Python中创建不可变类型

我的问题很简单,我有:

class upperstr(str):
    def __new__(cls, arg):
        return str.__new__(cls, str(arg).upper())
Run Code Online (Sandbox Code Playgroud)

为什么,如果我的__new__()方法是直接使用inmutable类型(str)的实例,我的新类型(upperstr)的实例是可变的?

>>> s = str("text")
>>> "__dict__" in dir(s)
False
>>> s = upperstr("text")
>>> "__dict__" in dir(s)
True
Run Code Online (Sandbox Code Playgroud)

如果我只重写__new __()方法,解释器在什么阶段将__dict__属性设置为upperstr intances?

谢谢!

python datamodel

1
推荐指数
1
解决办法
212
查看次数

标签 统计

python ×5

class ×1

datamodel ×1

immutability ×1

oop ×1

python-2.7 ×1

tuples ×1