http://www.javaworld.com/article/2076837/mobile-java/twelve-rules-for-developing-more-secure-java-code.html建议不要依赖初始化。具体来说,它建议如下。这些建议在Python中也是很好的做法吗?
不依赖于初始化
大多数Java开发人员认为无法分配对象 没有运行构造函数。但事实并非如此:有几个 分配非初始化对象的方法。
保护自己免受这个问题的简单方法是写你的 类,以便在任何对象执行任何操作之前,它会验证它 已初始化。您可以按如下方式执行此操作:
将所有变量设为私有。如果要允许外部代码访问对象中的变量,则应通过get和set
来完成 方法。 (这使得外部代码无法访问非初始化的 变量。)如果您遵循规则3,您将进行获取并设置
方法最终。为每个对象添加一个初始化的新私有布尔变量。
让每个构造函数在返回之前将初始化变量设置为最后一个操作。
让每个非构造方法在执行任何操作之前验证initialized是否为true。 (请注意,您可能必须例外 此规则适用于构造函数调用的方法。如果你这样做,
最好让构造函数只调用私有方法。)如果你的 class有一个静态初始化器,你需要做同样的事情 班级。具体来说,对于任何具有静态的类 初始化程序,请按照以下步骤操作:将所有静态变量设为私有。如果要允许外部代码访问类中的静态变量,则应该这样做 通过静态get和set方法。这样可以保留外部代码 访问非初始化的静态变量。如果你关注 规则3,您将使get和set方法最终。
在类中添加一个新的私有静态布尔变量classInitialized。
让静态构造函数在返回之前将初始化变量设置为最后一个操作。
在做任何事情之前,让每个静态方法和每个构造函数验证classInitialized是否为true。 (注意:构造函数是
需要调用超类的构造函数,或者另一个 同一个类的构造函数,作为它们的第一个动作。所以你会 在检查classInitialized之前必须这样做。)
答案 0 :(得分:1)
简短的回答是肯定的。这些规则都有助于尽可能地限制变量和方法的范围,以防止不必要的行为。这是几乎所有语言的最佳实践。但是,JAVA和python是完全不同的语言,因此对于很多这些JAVA建议,不会在Python中直接模拟。我希望这能回答你的问题
答案 1 :(得分:1)
这些要点中的大多数都涉及控制私有成员和静态变量的初始化。 Python中没有私有变量。当然,按照惯例,您可以执行以下操作,表示__private
是私有的。
class A:
def __init__(self):
self.__private = None
def getPrivate(self):
return self.__private
def failUninitialized(self):
return self.this_will_fail
然后为setter和getter提供属性,但是" private"变量仍可用作_A__private
> a = A()
> a._A__private = 1
> a.getPrivate()
1
>
Python抓住未初始化的方式'如果成员从未被分配到......并且你得到例外,他们就不会存在。
Python在第一次分配成员变量时创建成员变量。没有'声明'没有赋值的变量。因此它们要么存在,要么被初始化,要么它们从未被初始化,因此不存在。在后一种情况下,您会收到AttributeError
例外。
如果在没有调用getPrivate
的情况下以某种方式调用__init__
(如果派生类没有调用基类的构造函数,则会发生这种情况),它会抛出异常,因为成员没有名为_A__private
更简单地说,以下内容将失败
> a = A()
> a.failUninitialized()
因为对象a
没有名为this_will_fail