我的思维是Pythonic吗?

嘿,
好吧,众所周知,我正在学习python :)
让我烦人的一件事是python中的OOP.
在Java中考虑此代码:
- -
公共班车{
私人int速度;
私人弦品牌;
//播放器和获取器
}
- -
一看班级的顶部,您可以知道每个
实例有两个实例变量(速度和品牌).
我试图转变为Python:
- -
班车:
def setspeed(self,speed):
self.speed =速度
def setbrand(自我,品牌):
self.brand =品牌
- -
如果您有一个巨大的课程,则无法弄清楚实例变量
每个对象.
因此,我创建了这个构造函数:
- -
def __init __(自我):
self.speed =无
self.brand =无
- -
这样,我可以通过阅读
__init__方法.
您如何看待我的方法?它被认为是Pythonic吗?
有什么建议么?
谢谢你们.

# 回答1


侯赛因B:
您还可以学习_attribute和__ Attribute约定.
在python getter/setter中使用的频率很少,您可以删除这两个
设置器,只需从外部访问属性即可.
后来,在派生的课程中,如果您想让他们的工作更多
复杂您可以添加属性.
请注意,Python无法像Hotspot一样嵌入式内容,因此每个
getter/setter(或点:foo.bar.baz比foo.bar慢)
您的代码减慢.
有时我会做同样的事情,以"记录"所使用的属性.
再见,
# 回答2


侯赛因B写道:
该方法完全正确 - 实例变量应该是(不必,
但是)在__init __-方法内声明.
但是,您 *在定义Getters和Setters方面 *是不富有的.这些是
主要存在的Java-Atrocity是因为Java没有属性的概念
或委托,因此无法将代码添加到实例变量分配中.
因此,一个人需要将 *所有 *变量包装到get/set对中,以便在
行为改变的情况(例如懒惰)不需要更改
客户端代码.
也许这篇阅读将帮助您调整心态:http://dirtsimple.org/2004/12/python-is-not-java.html
diez
# 回答3


侯赛因b aécrit:
如果是这样,您问题的答案是"显然,不"! - )
好吧,让我们来看看...
除非您有令人信服的原因,请使用新样式的课程:
班车(对象)
Java,C ++等需要Getters和Setter,因为它们没有支持
对于计算的属性,因此您无法将平原属性转换为
计算出一个没有破坏代码的计算. Python对计算有很好的支持
属性,因此您只是不需要这些Getters和Setter.这
Pythonic翻译将是:
类汽车(对象):
def __init __(自我,速度,品牌):
self.speed =速度
self.brand =品牌
如果您的班级那么庞大,那么可能是时候进行重构了
和/或重新考虑您的设计.

S/构造函数/启动器/

如果我可能会问:为什么不将速度和品牌作为参数传递?如果你
想要允许无参数的呼叫,您始终可以使用默认值,即:
班级 汽车(对象):
def __init __(self,speed = none,brand = none):
self.speed =速度
self.brand =品牌
就我而言 - 和Modulo有关initiliser的问题
参数 - 我认为将所有实例属性设置为
尽可能在初始化器中明智的默认值,因此,当您
说,您不必浏览整个代码即可知道可用的内容.
现在请记住,Python对象(嗯,至少其中大多数是)
动态,因此可以在类声明主体之外添加属性.

# 回答4


通常,我在班级定义中命名成员,并将其设置为
没有...
班车:
速度=无
品牌=无
def __init __():
self.speed = defaultspeed #alternate,更常见的是,获取
这种速度作为初始化的参数
self.brand = DefaultBrand
解决了能够"查看"所有成员的问题
对象通过读取代码...但是,这一切都在窗口
动态组成实例(即元类型的东西).
# 回答5


克雷格·艾伦(Craig Allen)写道:
当我自己使用这个习语时,必须谨慎地不要创造不必要的
副作用如果有任何可变作用,则应发挥作用:
foo类:
bar = []
Def Baz(自我):
self.bar.append(2)
将 *不 *使bar实例变量可变性,但将其保持为类变量.
# 回答6


克雷格·艾伦:
我认为最好避免使用类属性
它们,然后用具有相同名称等的对象属性将它们阴影
看起来像是使事情变得混乱的一种方式...
再见,
# 回答7


En Thu,2008年8月21日14:31:02 -0300,Craig Allen
escribi�:
这不是一个好主意,正如该线程最近讨论的那样,http://groups.google.com/group/compphth/comphore59bcc29/
- -
Gabriel Genellina
# 回答8


Bruno Desthuilliers写道:
区别在3.0中消失了,所以我们可以停止燃烧人们
违反一条废话规则,在2.x中常常毫无意义,完全是毫无意义的
在3.0中毫无意义?
# 回答9


弗雷德里克·卢德(Fredrik Lundh)
区别在3.0中消失了,
是的,但不在2.5.2中,这仍然是当前稳定版本.
听到...现在 *这 *是一个非常合理的建议.
鉴于缺乏对描述符协议的适当支持
老式的课程和其他几个不同的行为,我不会说
建议新移民使用新样式课程是如此毫无意义.
# 回答10


Bruno Desthuilliers写道:
是的,但是如果您不需要描述符,新风格的课程不会买您
任何东西(在某些情况下有轻微放缓除外).教条使用
新样式的课程(或任何其他"新功能")不是" Pythonic".
# 回答11


弗雷德里克·卢德(Fredrik Lundh)
是的,但是如果您不需要描述符,新风格的课程不会买您
任何事物
除了python -3000准备好wrt/发散的行为 -
每类_________________________________________________________好,这是
当然不是一个很常见的情况,但是我们仍然看到了有关的问题
这个o n这个ng ... "教条" ??? 您可以在这里引用" new"一词 - 自Python以来多少年 明确打算替换原始对象模型的新对象模型?

标签: python

添加新评论