使用Java,不应该依赖于初始化。 Python也是如此吗?

时间:2015-06-02 22:36:59

标签: java python security constructor static

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之前必须这样做。)

  •   

2 个答案:

答案 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

的初始化成员变量