问个简单的类问题

快乐田伯光 2010-10-09 04:32:56
一本书上有这么个例子:

class Super:
def delegate(self):
self.action()

class Provider(Super):
def action(self):
print 'in Provider.action'


我的问题是,在基类里定义这个delegate()有什么意义? 看上去在基类里定义一个空的delegate(),在每个子类里去重新定义这个delegate()也一样也可以达到目的。
...全文
169 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2010-10-10
  • 打赏
  • 举报
回复
约定的东西应该是和不同的人打交道吧,倘若基类是别人写的,你就会提供它要求的,而不会费劲去改成自己的写法...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
那可以这样:

class Super:
def delegate(self):
print 'in super class'

class Provider(Super):
def delegate(self):
Super.delegate(self)
print 'in Provider class'


[Quote=引用 4 楼 angel_su 的回复:]
觉得就只是约定而已,因为例子过于简单所以重写delegate也行。不过如果delegate要做很多事,但大部分不需要改写,提供约定的函数即可...
[/Quote]
angel_su 2010-10-10
  • 打赏
  • 举报
回复
觉得就只是约定而已,因为例子过于简单所以重写delegate也行。不过如果delegate要做很多事,但大部分不需要改写,提供约定的函数即可...
I_NBFA 2010-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 guosha 的回复:]
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.

引用 2 楼 i_nbfa 的回复:
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
[/Quote]
你知识学死了,设计模式是一组抽象的设计方式,语言只是其实现工具,
不过是有的在语法层支持的全面些,有的单薄点,甚至不支持。
C语言如何照样OOP。甚至汇编也行,只不过复杂度问题。
python就没有绝对私有成员一说,_只是约定,__混淆后想访问也照样能存取。
按照你想法,python根本不支持OOP。
super能实例化,但没人强迫你实例化,就象没人强迫你非要直接存取__一样。
按照虚基类设计super, super就是个虚基类。那么你再实例化它的对象有啥意义呢?
如果有意义,那你设计的压根就不是一个虚基类。
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
那你举举C语言哪里有重复的现象? 你实现同一个目标, 或许用不同的方式可以实现, 但实现的侧重点肯定是不一样的. 自然语言怎么能跟计算机语言相题并论?
[Quote=引用 13 楼 iambic 的回复:]
从语言的设计上讲也没什么重复不重复可言的,就像一个人可以走,也可以跑,也可以跳,还可以不转身就后退,你非要说这些功能重复也可以,但这都是自然而然的行为,一门语言就应该如此运作,并不需要是什么刻意设计的结果。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
我觉得你是搞反了, 这里是讨论python, 写这两个简单的例子只是为了讨论python的多态. 而并不是打印一个字符串, 用不着去用python去写两个类, 这么简单的代码没什么意义可言. 谢谢
[Quote=引用 13 楼 iambic 的回复:]
这种简单的例子只是出于演示,当然也没什么“必要性”可言。打印一个字符串用的着写两个class吗?用C语言也能做用得着用python吗?
[/Quote]
iambic 2010-10-10
  • 打赏
  • 举报
回复
这个东西当然有用了。比如设计模式里的template模式,C++里的private virtual function的惯用法,这个例子里更可能是adapter模式:把一个对象的接口转换成另外一个接口,以便和程序的其他部分进行交互。

这种简单的例子只是出于演示,当然也没什么“必要性”可言。打印一个字符串用的着写两个class吗?用C语言也能做用得着用python吗?

从语言的设计上讲也没什么重复不重复可言的,就像一个人可以走,也可以跑,也可以跳,还可以不转身就后退,你非要说这些功能重复也可以,但这都是自然而然的行为,一门语言就应该如此运作,并不需要是什么刻意设计的结果。

angel_su 2010-10-10
  • 打赏
  • 举报
回复
我是觉得python的类很随便的,类本身就是个对象,实例的类型在运行期也是知道,方法属性也可以在实例生成后再添加,所以实现的手法真要较真那可能5花8门没完没了。其实lz的写法应该是最直观最多的啦,不过示例明确要求实现一个方法相形更简洁,如果还有其它基类方法也用上的话犯不着一个个改写吧...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
呵呵, 我很诚心来求教的, 只是交流, 不知你说的带了偏见是什么意思? 我只想求得一个令人信服的解释而已. 对于你解答问题的热情,我同样很感谢的

[Quote=引用 17 楼 iambic 的回复:]
算了,对于不准备认真接纳别人看法的人,没啥好讨论的了。因为你心中已经有固定的看法了。只能靠时间与经验去慢慢消磨你的偏见了。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
OK, 非常感谢!
[Quote=引用 16 楼 i_nbfa 的回复:]
引用 11 楼 guosha 的回复:
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.

引用 2 楼 i_nbfa 的回复:
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。

你知识学死了,设计模式是……
[/Quote]
iambic 2010-10-10
  • 打赏
  • 举报
回复
算了,对于不准备认真接纳别人看法的人,没啥好讨论的了。因为你心中已经有固定的看法了。只能靠时间与经验去慢慢消磨你的偏见了。
angel_su 2010-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guosha 的回复:]
肯定是有的区别的. 要不然python的设计者也不会原谅自己做了两个功能完全一样的设计……
[/Quote]
如你见有区别,但功效一样不是么,觉的python重复的东西可不少,不过对实务上无啥影响...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.
[Quote=引用 2 楼 i_nbfa 的回复:]
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
呵呵, 如果我只是咬文嚼字,我根本就不会问这个问题了, 我想要知道的是在应用编程的时候怎么选取合适的方式.
至于两者的差别,肯定不会是你说的'差别就是谁写的约定是啥', 肯定是有的区别的. 要不然python的设计者也不会原谅自己做了两个功能完全一样的设计.
[Quote=引用 9 楼 angel_su 的回复:]
没说你的写法不行,但既然都可以实现,差别就是谁写的约定是啥,不需要过于咬文嚼字。你自己写的模块当然按自己的风格写,然后别人用的时候照办就是...
[/Quote]
angel_su 2010-10-10
  • 打赏
  • 举报
回复
没说你的写法不行,但既然都可以实现,差别就是谁写的约定是啥,不需要过于咬文嚼字。你自己写的模块当然按自己的风格写,然后别人用的时候照办就是...
vivi_zz 2010-10-10
  • 打赏
  • 举报
回复
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
我没有看出你说的有什么差别,不过是在子类里把delegate的实现移动action()里而已. 你实现在delegate()跟在action()里怎么会有费劲不费劲的区别?
我想问的是这里有两种选择可以实现同样的效果,第一种是子类是直接重载delegate(), 第二种是基类delegate()里调用action, 子类实现action(). 我想知道的是有哪种情况第一种方式处理不了必须由第二种方式来处理.
[Quote=引用 6 楼 angel_su 的回复:]
约定的东西应该是和不同的人打交道吧,倘若基类是别人写的,你就会提供它要求的,而不会费劲去改成自己的写法...
[/Quote]
快乐田伯光 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]
看起来这段代码没什么实际意义,只是用来演示多态的。
[/Quote]

我知道这是用来演示多态的,但我没有看到这种必要.
比如:

class Super:
def delegate(self):
pass

class Provider(Super):
def delegate(self):
print 'in Provider.action'


这样做一样可以达到目的.

I_NBFA 2010-10-09
  • 打赏
  • 举报
回复
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
iambic 2010-10-09
  • 打赏
  • 举报
回复
看起来这段代码没什么实际意义,只是用来演示多态的。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧