基本继承问题

为我的语言做解析器,我看到所有班级(token,
生产,陈述,...)有一个共同点.他们都
保持源文本中的开始和停止位置.所以它看起来
逻辑使它们全部从定义这些的基类中继承,
但这无效:
导入表
班级代码:
def __init __(自我,开始,停止):
StartLoc = start
stoploc =停止
类令牌(代码):
经过
x = token(tok.loc(0,0),tok.loc(3,4))
打印x.startloc.repr(),x.stoploc.repr()
attributeError:令牌实例没有属性'startloc'
1)我的设计思考是否很好,还是绝望的意思?
2)如果很好,您如何访问基类数据属性? (这
Doc丰富的方法访问信息,在其他方面贫穷
属性.)

# 回答1


-ON [20080105 11:36],maxhyde*********@gmail.com(maxhyde***********@gmail.com)写道:
不应该是:
self.startloc = start
self.stoploc =停止
?
- -
jeroen ruigrok van der werven - 迷,http://www.in-nomine.org/ | http://www.rangaku.org/
敞开心heart并推动极限...
# 回答2


1月5日,10:31*上午,Martinrineh ...@gmail.com写道:
您已经忘记了明确的自我.
def __init __(自我,开始,停止):
self.startloc = start
self.stoploc =停止
- -
保罗·汉金
# 回答3


Jeroen Ruigrok van der Werven写道:
谢谢!当然应该.老爪哇习惯慢慢死亡.
# 回答4

maxhyde*********@gmail.com写道:
谢谢!当然应该.老爪哇习惯慢慢死亡.
这并不是真正的爪哇习惯.在Java和C ++中,我个人喜欢
来写
this.startloc = start
this.stoploc =停止
它表明什么是什么字段和什么"正常"变量
在这些语言中.
问候,
比约恩
- -
BOFH借口#294:
PCMCIA从驱动程序
# 回答5


在1月5日,5:40*下午,Martinrineh ...@gmail.com写道:
谢谢!当然应该.老爪哇习惯慢慢死亡.
不,说真的不是爪哇习惯,大多数其他语言都不会
需要班级名称的明确调用.
# 回答6


撒谎:
谢谢!当然应该.老爪哇习惯慢慢死亡.

不,说真的不是爪哇习惯,大多数其他语言都不会
需要班级名称的明确调用.
"班级名称的明确调用"到底在哪里?

# 回答7


在2008年1月5日上午11:31, 除了失踪的自我,请记住__init __(...)
除非您明确进行,否则不会自动调用基础类
或者您不提供派生类中的一个.
因此,例如,您可以有类似的东西
类令牌(代码):
def __init __(self,...):
#在此处进行令牌特定初始化
...
#现在启动基类
代码.__ init __(self,....)
或者,更好的是,您可以使用超级
如果您使用的是新样式的类(您不是...),例如
以下:
类令牌(代码):
def __init __(self,...):
#做你的初始 lization在这里
超级(token,self).__ init __(....)
这更适合允许多种继承(有
在这些天关于MRO的讨论中,寻找一篇论文
Michele Simionato).
简而言之,引用python中的Alex Martelli(第97页):
"如果您习惯总是与
超级,即使在复杂的继承中,您的课程也会顺利进行
结构.如果继承没有任何不良影响
当然,结构很简单,就像
您只使用新型的对象模型,正如我建议的那样.
再见,
francesco
# 回答8


1月5日,上午4:53,Bjoern Schliessmann 邮件-0306.20.chr0n ...@spamgourmet.comwrote:
这并不是真正的爪哇习惯.在Java和C ++中,我个人喜欢
来写
this.startloc = start
this.stoploc =停止
它表明什么是什么字段和什么"正常"变量
在这些语言中.
我的雇主让我们使用" M_"约定.
我想知道为什么Bjarne首先将" This->"选为可选.
# 回答9


1月7日,2:46*AM,Bruno Desthuilliers
"班级名称的明确调用"到底在哪里?
也许我在写那本书时有点累(我不明白
我写的话,如果我是你)...我的意思是大多数其他语言
通常不会强制我们明确说明包含类
名称,在Python中通常称为"自我".大多数其他语言
1)在关键字中自动分配包含类'对象
(java:this,vb:me)屏幕后面,2)自动搜索
本地变量表和包含的可变名称
类变量表(因此,请参考一个名为VAR的类变量
课堂内的方法,我们只需要写var,而不是self.var
Python).在vb中,我很少使用我,在python中,自我就是
在这个地方.好吧,双方都有正面和负面的
VB的便利性和Python的灵活性.
比较以下代码:
vb.net:
公共级
DIM VAR
公共功能afunction()
返回var
Python:
A类:
def afunction(self):
返回self.var
# 回答10


撒谎:
"班级名称的明确调用"到底在哪里?

也许我在写那本书时有点累(我不明白
我写的话,如果我是你)...我的意思是大多数其他语言
通常不会强制我们明确说明包含类
名称,在Python中通常称为"自我".
"自我"(或您命名的任何名字)不是"包含类名",
这是功能的第一个论点 - 通常恰好是
当函数用作方法时的当前实例.
S/包含类的对象/当前实例/
这与Python方法对象所做的事情不远 -
自动将当前实例分配给某物.区别
是Python使用函数来实现方法(而不是
两个截然不同的发现),所以 "注入"的唯一可靠方法
对当前实例的引用是将其作为参数传递给
功能(而不是使其从纯空气中弹出).
该解决方案有一些好处.其中之一就是能够
动态分配函数作为方法.所以如果你有一些
功能以对象为第一个参数,您可以轻松地将其转换为
一个方法.
如您所知,这不能与Python的范围规则合作,并且
动态性.无论如何,隐式对象引用绝对是
Badthing(TM)WRT/读取性,特别是带有多力量语言
(例如Python或C ++).你为什么认为许多C ++商店强加了
M_Something命名计划?
无论如何,我实际上知道3种语言(如果C#工作相同)
这个隐含的"这个"(或任何名称)'功能',至少5个
那不是.所以我不确定"大多数其他语言"预选赛
真正适用于第2点! - )
我曾经系统地使用它 - 就像我一直系统地使用
在C ++和Java中的"此".
就我而言,隐式对象中没有 * *
参考,从来没有(在某个偏执狂的坚果箱之前
周围指责我过度狂热:我已经保持着同样的态度
在我发现Python之前的几年).
添加三个级别的继承和几个全球群体,您会发现
可读性计数! - )
在任何非平凡的C ++代码中,除非作者使用
明确的" this"参考或'm_xxx'命名约定,您将
很难弄清浏览时给定名称的位置
函数代码.

# 回答11


在1月15日,9:00*下午,布鲁诺·戴斯图里尔(Bruno Desthuilliers)<布鲁诺(Bruno).
42.desthuilli ...@wtf.websiteburo.oops.comwrote:
"自我"(或您命名的任何名字)不是"包含类名",
当前实例是我的意思,感谢您指出的
我用过的错误术语.
这就是重点,自我(或您命名的任何东西)几乎总是
当前实例,这使其在功能上与我相同,并且
这在VB和Java中.
S/包含类的对象/当前实例/
这与Python方法对象所做的事情不远 -
自动将当前实例分配给某物.区别
是Python使用函数来实现方法(而不是
两个截然不同的发现),因此"注入"的唯一可靠方法
对当前实例的引用是将其作为参数传递给
功能(而不是使其从纯空气中弹出).
这不是很远,但是Python使作业显而易见
(不在屏幕后面).
确实,许多语言不允许动态分配功能
这使得将当前实例自动分配给我/
这可能会受到最小的伤害.
如您所知,这不能与Python的范围规则合作,并且
动态性.无论如何,隐式对象引用绝对是
Badthing(TM)WRT/读取性,特别是带有多力量语言
(例如Python或C ++). 你为什么认为许多C ++商店强加了
M_Something命名计划?
如果
一堂课是如此复杂,有10个以上的级别级别
可变,那么很明显,该类需要分散为
较小的班级.记住少于10个变量并避免命名
仅10个变量之间的碰撞并不难(10也确实很难
许多,大多数类仅应使用2-4个变量),尤其是在您
拥有使用类似IntelliSense的技术的良好IDE(空闲
它).使用相同的名称,这总是一件坏事(TM)
类和功能中的变量(这是主要的,唯一的
即使在Python中,任何语言中可能的歧义来源).
这5种语言是什么?他们是主流,高级语言
还是鲜为人知的低级语言? C家族,Java和Basic是
高级编程语言的三大.
我曾经系统地使用它 - 就像我一直系统地使用
``这个''在c ++ *和java中.
这就是降低可读性的原因.熟练的VB/C/Java
程序员会皱着眉头皱眉
认为该变量已经是指班级级别的
多变的.如果像python一样,自我的使用是
由语言强制执行,不会被视为额外
不必要的垃圾.
就我而言,隐式对象中没有 * *
参考,从来没有(在某个偏执狂的坚果箱之前
周围指责我过度狂热:我已经保持着同样的态度
在我发现Python之前的几年).
有一个主要的积极要点:便利和较短的代码.
(那不是两个吗?)
正如我指出的那样,类级变量几乎没有伤害
隐式参考.
添加三个级别的继承和几个全球群体,您会发现
可读性计数! - )
如果目前
课程是从另一堂课继承的,您必须将其视为
来自父班的名称,因为它是本地名称,所以您实际上没有
自从知道它的位置以来,需要知道变量的来源
来自打破封装的来源(在Python中非常
弱实施,在许多情况下有利于灵活性[1]).
[1]在Python中,不可能创建一个完全私人
变量,这就是其他其他人的心理模型的原因
语言不适合python.
如果您习惯了隐式命名方案,那么很容易知道
变量来自(即使不是当前范围),它是类范围
并搜索两个短变量表(简短!创建复杂
课程适用于愚蠢的程序员[2])同时不是
人类的昂贵操作,尤其是在回忆是
实施的.
[2]我仍然在我仍然创建一个极其复杂的课程
编程中的绿色,这让我多次打击.小,简单
课是一件好事 (Tm值).课程应使用少于10个变量,
尽管建议的数字为2-3个变量.功能名称
应该尽可能少,使用过载和覆盖
应该最大化.
最后注意:
我认为隐性类参考不优于明确的类
参考,我也不认为明确的班级参考优于
隐式类参考.我认为两者都有自己的 +s和-s.我
仅指出隐式确实有其好处,具体取决于
使用的语言(显然Python不会从使用隐式中受益
行为,因为它是极其动态的).
# 回答12


谎言写道:
这就是降低可读性的原因.
恕我直言,不是,不是.这是第n次(n> 1)此讨论
来到这里.如果我从那些非常漫长的人那里学到了一件事
讨论,就是Python的"自我"处理不会
改变.
C程序员肯定没有意见,因为它没有
本地课程.
就个人而言,我看过许多带有复杂课程设计的C ++程序
它绝对有助于始终如一地使用" this->".我不能
请记住所有较大方法中的所有局部(和全局)变量.
较短的代码本身不是正面的,也不方便.如果它
是,每个人都会使用Perl.
问候,
比约恩
- -
BOFH借口#109:
停车场中的电力变电站炸毁.
# 回答13


撒谎:
(剪)
"自我"(或您命名的任何名字)不是"包含类名",

当前实例是我的意思,感谢您指出的
我用过的错误术语.
这就是重点,自我(或您命名的任何东西)几乎总是
当前实例
#这是一个简单的函数.在此功能中,
#'obj'可以是碰巧拥有(数字)的任何东西
#'quitt'属性
def func(obj,arg):
返回(obj.stuff + arg) / 2.0
#这是一个具有实例属性" stupt"的类
类foo(对象):
def __init __(self,bar):
self.stuff = bar + 42
#这是另一个(主要是无关的)类
#带有类属性的"东西"
类栏(对象):
东西= 42
#这是一个虚拟容器类:
类假(对象):通过
#现在让我们玩:
导入新
d =虚拟()
D.Stuff = 84
打印功能(D,1)
d.baaz = new.instancemethod(Func,d,type(d))
印刷D.Baaz(2)
f = foo(33)
打印功能(F,3)
foo.baaz = func
F.Baaz(4)
打印功能(酒吧,5)
bar.baaz = ClassMethod(func)
Bar.baaz(6)
取决于上下文,CF上面! - )
S/包含类的对象/当前实例/
这不是很远,但是Python使作业显而易见
(不在屏幕后面).
确切地.并鉴于解决方案的简单性及
您这样做了,这是一个 *非常 * Goodthing(TM)IMHO.
(剪)
如您所知,这与Python的范围规则和动力学无法搭配.无论如何,隐式对象引用最终是abadthing(TM)WRT/读取性,特别是带有多载体语言(例如Python或C ++).您为什么认为许多C ++商店强加了他们的命名计划?

隐式ob 如果
一堂课是如此复杂,有10个以上的级别级别
可变,那么很明显,该类需要分散为
较小的班级.
不必要.有一般规则(例如,"让您的课程都小
我完全同意这一点,有指导原则(例如
'超过10个会员变量可能闻起来像是重构的),并且
在现实生活中,一个经常面临的课程
超过10个会员变量,仍然像
可能的.
我真的怀疑您可以编写任何工作的非平凡软件
试图严格遵守此规则.
闲置当然不是我书中的"好IDE".
ho,是的...就像,这会很糟糕吗?
班级人(对象):
def __init __(自我,名称,姓氏,生日,性别):
self.firstname = firstName
self.lastName = lastName
self.birthdate =生日
self.gender =性别
来吧,要认真.通常很难带有明智的名字,
为什么也必须找到同义词?尝试带东西
比上面更可读,并让我们知道.说真的,这个脑脱头
关于"不使用属性和本地var的同一名称"的规则
显然来自语言,"此"裁判是可选的,并且
fwiw显然是解决真正问题的错误解决方案(好
当然,解决方案是使用完全合格的名称
属性,因此没有可能的歧义).
这5种语言是什么?
SmallTalk,Python,PHP,JavaScript,Ruby.我不记得如何计划
关闭和OCAML处理案件.
C,C ++,Java和Basic都不符合"高级"的资格. C是最低的
在组件上方可能的级别,C ++通常称为"对象
定向汇编器",Java过于静态,残废,冗长
未表现为"高级别"(即使它遭受了一些
通常与更高级别的语言相关的问题).我什至不会
评论基本(这真的是一种语言吗?).
我曾经系统地使用它 - 就像我在C ++和Java中一直系统地使用了这一点.

这就是降低可读性的原因.熟练的VB/C/Java
程序员

这里有很多熟练的C/C ++/Java程序员.据,直到...为止
我担心,我不会假装自己 - 我只有足够好
了解C,Java和(alas)VB能够在A中起步
理性的时间范围.
附带说明,问题在C中根本不存在,它具有
绝对不支持OO.
在C ++中,使此"清晰"的规范方法是使用m_name
惯例. C ++程序员必须有某种原因感到需要
这个"额外的,不需要的垃圾"? - )
就我而言,隐含的对象率没有 *积极的观点,而且从来没有(在某些偏执狂的核心核心指责我过度狂热之前:我已经在发现python之前就已经保持了这一非常相同的时间).

有一个主要的积极要点:便利 E和较短的代码.
(那不是两个吗?)
这些在我的书中没有被评为"积极".这也许就是为什么Python
这么远吗?
在任何非平凡的C ++项目上都有一些工作经验吗?
添加三个级别的继承和几个全球范围,您会发现可读性数量! - )

如果目前
课程是从另一堂课继承的,您必须将其视为
来自父班的名称,因为它是本地名称,所以您实际上没有
需要知道变量来自何处
在C ++(和VB IIRC)中,这也可能是一个全球性的,很抱歉,是的,我
必须知道它来自哪里.
不,它知道您在做什么以及软件如何
手正在工作.和fwiw,虽然数据隐藏是一种可能的均值
封装,这绝不是封装的同义词.
从来没有听说过C ++中臭名昭著的" #Define Private Pival" hack?
不用担心,也有一些方法可以找到所谓的"私人" vars
在Java.
如果您习惯了隐式命名方案,那么很容易知道
变量来自(即使不是当前范围),它是类范围
您忘记了全球范围.
(剪)
"福利"这是一个判断电话.碰巧我也没有
可能大多数人在这里分享您的判断.的时间
您要说的是"导入这个".
不仅.这也是(就我而言,几乎是我的)
可读性问题.
无论如何:这个已故的马 - 贝恩 - 贝登 - 靠背...所以如果你
*真的*想拥有最后一句话,我把它留给你! - )

# 回答14


(弄乱了引用?)
谎言写道:
请不要混合跟进.
问候,
比约恩
- -
BOFH借口#11:
来自金钱/信用卡的磁干扰

标签: python

添加新评论