关于"Python不是Java"的问题

Ewy*_*ato 6 python

我是一名具有基本Java经验的新手程序员,目前正在学习Python.我在另一个问题主题中偶然发现了这篇博文:

http://dirtsimple.org/2004/12/python-is-not-java.html

我对发布的主题有几个问题:


1)"哦,所有那些Foo.Bar.Baz属性链都不是免费的......,所以每个点都很重要."

这个特殊问题的解决方案是事先导入模块及其方法吗?如:

       from Foo.Bar import Baz
       ...
       #now Baz() can be called directly without using Foo.Bar.Baz() everytime
Run Code Online (Sandbox Code Playgroud)

2)有转换声明吗?Python转换是一个哈希表,而不是一堆if-then语句.

关于这个主题有几个相关的答案,但它们也提出了几个问题:

  1. if-else的使用更清晰,但它没有switch语句中常量时间O(1)的优点.
  2. 使用哈希表示恒定时间O(1)
  3. 在hash中使用lambda函数进行比较(不推荐)
    • 为什么不推荐?是因为lambda函数删除了哈希的常数因子吗?
  4. 使用bisect模块
    • 这个方法是保留常量时间O(1),还是只是另一种lambda函数?
    • 那么Python中的哪个方法,即等于switch语句,具有恒定时间O(1),同时允许比较语句?

3)吸气剂和制定者是邪恶的.邪恶,邪恶...不写getter和setter ......这就是内置的'属性'......在Python中,这个(getter和setter)是愚蠢的,因为你可以从正常开始属性并随时改变主意,不会影响班级的任何客户.

我真的不太了解这一部分.

此外,似乎在Python中可以轻松访问公共和私有方法或变量,与C++和Java相比.这种行为有任何设计原因吗?


最后,是否有任何关于Python与其他编程语言的推荐进一步阅读?

小智 8

  1. 这很重要.如果是这样的话,你最好还是编写C(或者让Cython为你做这件事,使用静态类型注释使其真正计算),使用PyPy(他们的JIT可以完全删除这些查找和更多东西,甚至是内存分配,在某些循环中)等
  2. "lambda"与"if-elif chain"或"bisect"属于不同的类别.你具体指的是什么技术?许多人不喜欢,lambda因为他们认为它相对冗长或不可读(至少它的一些用途可以很快变成这样).bisect只是保持一个有序列表,所以你得到的最好的查找是O(log N)二进制搜索.你想要一个switch语句?使用dicts.比较(==当然除了)超出范围,switch并且大多数事情通常与它们进行比较,无论如何都不能进行O(1)查找.
  3. 怎么样是不可理解的?编写Python时,不要编写getter或setter方法.您使用普通属性.如果稍后在属性访问/修改时发现需要一些进一步的逻辑,则将其转换为属性,并且使用它的所有代码都可以在不进行更改的情况下运行.
  4. 至于缺乏真正的隐私 - 这已被多次提出和回答,简短的回答是"我们都是在这里的成年人",即程序员被信任不会乱搞私人事物,除非他们有充分的理由.另一个较弱的原因是,这很难用动态语言实现,至少对于当前的对象模型(例如,方法只是普通函数).


Jim*_*nis 5

  1. 通常答案是使用本地名称(变量)来引用所讨论的特定对象实例(例如,在循环的范围内).Python的后期绑定动态语义要求其解释器遍历每个".".每次引用因为每个绑定到的对象可能已经通过循环中的先前迭代而改变.与大多数关于性能的其他评论一样,在你大规模操作之前没有太大的区别(数百万次循环迭代乘以几层"."dereferences)

  2. 有时,更好的方法是重新思考您的设计并使用"更智能"的对象.经常使用switch/case语句在一个对象类中实现不同的行为,其中一个可以实现许多相关的类,每个类根据它们自己的类型"做正确的事".其他时候,正如评论所暗示的那样,您将创建键和对象(函数,实例,lambdas等)的字典("哈希")并将其用作调度表.

  3. Python允许您直接访问属性(没有getter/setter方法),如果需要,可以使用属性来确保隐式执行您自己的代码(getter/setter).你的代码的用户不必知道或关心whather foo.bar=1直接绑定新值foobar属性,或者是否在打电话的方法,foo这是执行一些国际状态操作,这将是通过访问可见foo.bar以后.这些是实施细节.使用该语言鼓励程序员将所有对象/属性引用实现为显式".get()"和".set()"调用,同时仍支持更简单的"." 语法赋予代码不受益; 它只是使代码更混乱,更难阅读.

是的,可以轻松访问属性和方法,并且难以"隐藏"它们.它使语言更容易使用.(计数器论证它使类更容易"滥用" - 即它允许用户访问不打算公开的类的实现细节......它不会强迫它们遵守预期这是一个没有实际意义的问题.如果你的课程记录了预期的界面并合理地实现了它们,那么那些是大多数程序员将使用的界面.如果他们觉得需要弄清楚你的实现细节你可能做错了 - 和他们的另一种选择就是重新实施你所做的一切,以解决你施加的限制.