Tag: 类方法

使用超级类的方法

我想学习Python中的super()函数。 虽然我已经掌握了它,直到我通过这个例子(2.6),发现自己卡住了。 http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html#super-with-classmethod-example Traceback (most recent call last): File "<stdin>", line 1, in <module> File "test.py", line 9, in do_something do_something = classmethod(do_something) TypeError: unbound method do_something() must be called with B instance as first argument (got nothing instead) >>> 当我在这个例子之前阅读这一行时,并不是我所期望的: 如果我们使用一个类方法,我们没有一个实例来调用super。 幸运的是,对于我们来说,super甚至可以使用types作为第二个参数。 —types可以直接传递给super,如下所示。 这正是Python告诉我的,说do_something()应该用B的一个实例调用是不可能的。 提前致谢

__getattr__用于python中的静态/类variables

我有一个类像: class MyClass: Foo = 1 Bar = 2 每当MyClass.Foo或MyClass.Bar被调用,我需要一个自定义的方法被调用之前返回的值。 在Python中可能吗? 我知道这是可能的,如果我创build一个类的实例,我可以定义我自己的__getattr__方法。 但是我的scneario涉及到使用这个类而不创build任何实例。 另外我需要调用str(MyClass.Foo)时调用自定义的__str__方法。 Python是否提供这样的选项?

如何理解class_eval()和instance_eval()之间的区别?

Foo = Class.new Foo.class_eval do def class_bar "class_bar" end end Foo.instance_eval do def instance_bar "instance_bar" end end Foo.class_bar #=> undefined method 'class_bar' for Foo:Class Foo.new.class_bar #=> "class_bar" Foo.instance_bar #=> "instance_bar" Foo.new.instance_bar #=> undefined method 'instance_bar' for #<Foo:0x7dce8> 只是基于方法的名称, 我希望class_eval允许您将类方法添加到Foo和instance_eval,以允许您将实例方法添加到Foo。 但他们似乎做了相反的事情 。 在上面的例子中,如果你调用Foo类的class_bar,你会得到一个未定义的方法错误,如果你在Foo.new返回的实例上调用instance_bar,你也会得到一个未定义的方法错误。 这两个错误似乎都与对class_eval和instance_eval应该做什么的直观理解相矛盾。 这些方法真的有什么区别? class_eval的文档: mod.class_eval(string [,filename [,lineno]])=> obj 评估mod的上下文中的string或块。 这可以用来添加方法到一个类。 文档instance_eval : obj.instance_eval {| […]

什么时候应该使用@classmethod和def方法(self)?

在集成一个我以前没有用过的Django应用程序的时候,我发现了两种不同的用于在类中定义函数的方法。 作者似乎非常有意地使用它们。 第一个是我自己用的很多: class Dummy(object): def some_function(self,*args,**kwargs): do something here self is the class instance 另一个是我不使用的,主要是因为我不明白什么时候使用它,以及为什么: class Dummy(object): @classmethod def some_function(cls,*args,**kwargs): do something here cls refers to what? 在Python文档中, classmethod装饰classmethod这句话来解释: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想cls是指Dummy本身( class ,而不是实例)。 我不完全明白为什么会这样,因为我总是可以这样做: type(self).do_something_with_the_class 这只是为了清楚起见,还是我错过了最重要的部分:没有它的事情是不可能做到的令人着迷和迷人的事情?

ActiveRecord的Rails 3范围与类的方法

我是新来的ActiveRecord的新查询接口,所以我仍然搞清楚事情。 我希望有人可以解释在ActiveRecord模型中使用scope和仅使用类方法(即self.some_method )之间的self.some_method 。 从我所能得到的结果来看,一个范围总是被期望返回一个关系,而一个类方法并不一定非要。 这是真的? 例如,我认为这样做是有道理的: class Person scope :grouped_counts, group(:name).count end 但是这不起作用。 我得到这个错误: ArgumentError: Unknown key(s): communicating, failed, matched, unmatched from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:43:in `assert_valid_keys' from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/relation/spawn_methods.rb:110:in `apply_finder_options' from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/named_scope.rb:110:in `block in scope' from (irb):48 from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start' from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start' from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>' r 它不过是一个类方法 def self.grouped_counts […]

在Python中调用基类的classmethod

考虑下面的代码: class Base(object): @classmethod def do(cls, a): print cls, a class Derived(Base): @classmethod def do(cls, a): print 'In derived!' # Base.do(cls, a) — can't pass `cls` Base.do(a) if __name__ == '__main__': d = Derived() d.do('hello') > $ python play.py > In derived! > <class '__main__.Base'> msg 从Derived.do ,我如何调用Base.do ? 如果这是一个普通的对象方法,我通常会直接使用super或甚至基类名称,但显然我找不到一种方法来调用基类中的classmethod。 在上面的例子中, Base.do(a)打印Base类而不是Derived类。

我如何使用define_method来创build类方法?

如果您尝试以元编程方式创build类方法,这非常有用: def self.create_methods(method_name) # To create instance methods: define_method method_name do … end # To create class methods that refer to the args on create_methods: ??? end 我的回答是…

Ruby:从实例调用类方法

在Ruby中,如何从该类的实例中调用一个类方法? 说我有 class Truck def self.default_make # Class method. "mac" end def initialize # Instance method. Truck.default_make # gets the default via the class's method. # But: I wish to avoid mentioning Truck. Seems I'm repeating myself. end end 行Truck.default_make检索默认。 但是有没有提到这个,而不提卡Truck ? 似乎应该有。

“类方法”和“静态方法”有什么区别?

我已经使用了几种不同的语言,如Java,C#和Objective-C。 在大多数语言中,不需要对象实例的方法称为静态方法。 然而,当谈到Objective-C时,有些人把它们称为静态方法时会有防御性,他们希望你称之为类方法。 为什么他们调用类方法而不是静态方法? 静态方法和类方法有什么区别?

类和实例方法有什么区别?

类方法和实例方法有什么区别? 实例方法访问器(getter和setter),而类方法几乎是一切?