13

正常方式:

class A:
    def __init__(self):
        self.a.b.c = 10

    def another_method(self):
        self.a.b.c = self.a.b.c * 10

别名方法:

class A:
    def __init__(self):
        self.a.b.c = 10         
        alias self.aliased = self.a.b.c  # Creates an alias 

    def another_method(self):
        self.aliased = self.aliased * 10  # Updates value of self.a.b.c

如何在 Python 中实现别名?我想这样做的原因是为了减少由于长变量名造成的混乱。这是一个多线程环境,所以简单地复制到局部变量是行不通的。

4

2 回答 2

27

解决这个问题的方法是使用 getter 和 setter 方法——幸运的是 Python 有内置property()函数来隐藏它的丑陋之处:

class A:
    def __init__(self):
        self.a.b.c = 10

    @property
    def aliased(self):
        return self.a.b.c

    @aliased.setter
    def aliased(self, value):
        self.a.b.c = value

    def another_method(self):
        self.aliased *= 10  # Updates value of self.a.b.c

一般来说,像这样的深层嵌套属性self.a.b.c是糟糕设计的标志——你通常不希望类必须知道距离 3 个关系的对象——这意味着对给定项目的更改可能会导致整个代码库出现问题。尝试让每个类处理它周围的类是一个更好的主意,仅此而已。

于 2012-06-15T11:58:28.967 回答
6

Python 不会隐式复制任何内容,它只存储引用,因此无论您在哪个环境中它都可以工作。

# this creates a list and stores a *reference* to it:
really_really_long_variable_name = [] 
# this creates another new reference to the *same list*. There's no copy.
alias = really_really_long_variable_name

alias.append('AIB')
print really_really_long_variable_name

你会得到['AIB']

于 2012-06-15T11:39:27.077 回答