我正在尝试在 Python 中子类化 set 对象,使用类似于下面的代码,但我无法计算出要使用的 __repr__ 的合理定义.
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
我想以这样的方式定义 __repr__ 以获得以下输出:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
但是,如果我不覆盖 __repr__,我得到的输出将忽略 name 值......
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
…而如果我确实重写了 __repr__,我无法在不创建新的集合实例的情况下直接访问集合中的值:
class Alpha(set):
…
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, set(self))
这可行,但是为 __repr__ 创建一个新的 set 实例然后将被处理对我来说似乎笨重且效率低下。
有没有更好的方法来为这类类定义 __repr__?
编辑:我想到的另一个解决方案:我可以在本地存储集合。它似乎比其他选项(为 __repr__ 的每次调用创建和销毁一些东西或使用某种形式的字符串操作)稍微整洁一些,但对我来说仍然不太理想。
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
self._set = set(s)
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, self._set)
最佳答案
除了展示一些基准之外,我想我还有一些东西可以满足您的需求。尽管我确信在内存使用方面存在差异,但它们几乎完全相同。
#!/usr/bin/env python
import time
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
def __repr__(self):
return '%s(%r, set(%r))' % (self.__class__.__name__,
self.name,
list(self))
class Alpha2(set):
def __init__(self, name, s=()):
super(Alpha2, self).__init__(s)
self.name = name
def __repr__(self):
return '%s(%r, set(%r))' % (self.__class__.__name__,
self.name,
set(self))
class Alpha3(set):
def __init__(self, name, s=()):
super(Alpha3, self).__init__(s)
self.name = name
def __repr__(self):
rep = super(Alpha3, self).__repr__()
rep = rep.replace(self.__class__.__name__, 'set', 1)
return '%s(%r, %s)' % (self.__class__.__name__,
self.name,
rep)
def timeit(exp, repeat=10000):
results = []
for _ in xrange(repeat):
start = time.time()
exec(exp)
end = time.time()-start
results.append(end*1000)
return sum(results) / len(results)
if __name__ == "__main__":
print "Alpha(): ", timeit("a = Alpha('test', (1,2,3,4,5))")
print "Alpha2(): ", timeit("a = Alpha2('test', (1,2,3,4,5))")
print "Alpha3(): ", timeit("a = Alpha3('test', (1,2,3,4,5))")
结果:
阿尔法():0.0287627220154
Alpha2(): 0.0286467552185
Alpha3(): 0.0285225152969
关于python - 在 Python 中设置子类时定义 __repr__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494358/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc