标签: class-method

在Ruby中有任何相关的语法应用程序:class << self ... end

class << self
attr_accessor :n, :totalX, :totalY
end
Run Code Online (Sandbox Code Playgroud)

上面的语法用于定义类实例变量.但是当我考虑语法含义时,它对我没有任何意义,所以我想知道这种类型的语法是否用于任何其他类型的定义.我在这里的困惑是:

class << self
Run Code Online (Sandbox Code Playgroud)

追加运算符通常意味着"向左侧的对象添加右侧的内容".但是在这个块的上下文中,如何将"将此块的内容放入类实例的定义而不是实例"?

出于同样的原因,我很困惑为什么在一个上下文类中,<< self可以定义类实例变量,而在另一个上下文它似乎创建了类变量,例如:

class Point
  # Instance methods go here
  class << self
    # Class methods go here
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby class-method class-variables class-instance-variables instance-methods

11
推荐指数
1
解决办法
1657
查看次数

Ruby:我可以在类方法中使用实例方法吗?

我有一个包含这个类方法的类:

def self.get_event_record(row, participant)
  event = Event.where(
      :participant_id   => participant.id,
      :event_type_code  => row[:event_type],
      :event_start_date => self.format_date(row[:event_start_date])
  ).first

  event = Event.new(
      :participant_id   => participant.id,
      :event_type_code  => row[:event_type],
      :event_start_date => self.format_date(row[:event_start_date])
  ) if event.blank?

  event
end
Run Code Online (Sandbox Code Playgroud)

我在同一个类中也有一个实例方法:

def format_date(date)
  parsed_date = date.split('/')

  # if month or day are single digit, make them double digit with a leading zero
  if parsed_date[0].split("").size == 1
    parsed_date[0].insert(0, '0')
  end
  if parsed_date[1].split("").size == 1
    parsed_date[1].insert(0, '0')
  end

  parsed_date[2].insert(0, '20')

  formatted_date = parsed_date.rotate(-1).join("-")
  formatted_date
end
Run Code Online (Sandbox Code Playgroud)

我得到一个'未定义的方法'错误#format_date.( …

ruby ruby-on-rails class-method instance-methods

11
推荐指数
2
解决办法
2万
查看次数

Python - 如何从类方法中获取类名 - 使用@classmethod

我有以下代码:

class ObjectOne(object):
    @classmethod
    def print_class_name(cls):
        print cls.__class__.__name__

    def print_class_name_again(self):
        print self.__class__.__name__

if __name__ == '__main__':
    obj_one = ObjectOne()
    obj_one.print_class_name()
    obj_one.print_class_name_again()
Run Code Online (Sandbox Code Playgroud)

输出是:

type
ObjectOne
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

ObjectOne
ObjectOne
Run Code Online (Sandbox Code Playgroud)

但我想test_cls通过@classmethod装饰器保持作为类方法.

我怎么能做到这一点?

python class-method

11
推荐指数
3
解决办法
2万
查看次数

编写一个引用实例和类的python方法

假设我们在Python中有一个Pet类:

class Pet(object):
    num_pets = 0

    def __init__(self, name):
        self.name = name
        Pet.num_pets += 1

    def speak(self):
        print("My name's %s and the number of pets is %d" % (self.name, self.num_pets))
Run Code Online (Sandbox Code Playgroud)

我希望init方法创建一个实例,但也要更新类的属性.有没有比上面的代码更优雅的方式来做到这一点?我试图传递selfcls到init方法,然后参照CLS,而不是宠物,其中num_pets递增,但没有奏效.

python oop class-method

11
推荐指数
1
解决办法
306
查看次数

如何在不引用类的情况下调用Objective C中的+ class方法?

我有一系列"策略"对象,我认为这些对象可以作为一组策略类的类方法实现.我为此指定了一个协议,并创建了符合的类(如下所示)

@protocol Counter   
+(NSInteger) countFor: (Model *)model;
@end

@interface CurrentListCounter : NSObject <Counter> 
+(NSInteger) countFor: (Model *)model;
@end
Run Code Online (Sandbox Code Playgroud)

然后我有一个符合这个协议的类的数组(像CurrentListCounter那样)

+(NSArray *) availableCounters {
return [[[NSArray alloc] initWithObjects: [CurrentListCounter class], [AllListsCounter class], nil] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

注意我是如何使用像对象这样的类(这可能是我的问题 - 在Smalltalk类中,对象就像其他所有 - 我不确定它们是否在Objective-C中?)

我确切的问题是,当我从数组中取出一个策略对象时,我想调用该方法:

id<Counter> counter = [[MyModel availableCounters] objectAtIndex: self.index];
return [counter countFor: self];
Run Code Online (Sandbox Code Playgroud)

我在return语句中得到一个警告 - 它表示-countFor:在协议中找不到(所以它假定它是一个实例方法,我想调用一个类方法).但是,由于我的数组中的对象是类的实例,它们现在就像实例方法(或者概念上它们应该是).

有没有一种神奇的方法来调用类方法?或者这只是一个坏主意,我应该只创建我的策略对象的实例(而不是使用类方法)?

metaprogramming objective-c class-method

10
推荐指数
2
解决办法
2万
查看次数

如何将函数作为类属性赋值成为Python中的方法?

>>> class A(object): pass
>>> def func(cls): pass
>>> A.func = func
>>> A.func
<unbound method A.func>
Run Code Online (Sandbox Code Playgroud)

这个赋值如何创建一个方法?对于类,赋值执行以下操作似乎不直观:

  • 将函数转换为未绑定的实例方法
  • 将函数包含在classmethod()类方法中(实际上,这非常直观)
  • 将函数包含在staticmethod()函数中

似乎第一个应该有一个instancemethod(),而对于最后一个,根本不应该有一个包装函数.我知道这些是用于class块内的用途,但为什么它们应用于它之外呢?

但更重要的是,如何将函数分配到一个类中?什么魔法可以解决这3件事?

更令人困惑的是:

>>> A.func
<unbound method A.func>
>>> A.__dict__['func']
<function func at 0x...>
Run Code Online (Sandbox Code Playgroud)

但我认为在检索属性时,这与描述符有关.我不认为这与设置属性有很大关系.

python class-method

10
推荐指数
1
解决办法
3279
查看次数

目标C:[ClassName self]是什么; 做?

我正在查看CocoaHTTPServer项目的源代码,更具体地说是HTTPServer.m文件,我只是不明白这一行:

connectionClass = [HTTPConnection self];
Run Code Online (Sandbox Code Playgroud)

这是做什么的(它在任何地方记录)?它甚至如何编译?不应该

connectionClass = [HTTPConnection class];
Run Code Online (Sandbox Code Playgroud)

class objective-c class-method httpserver

10
推荐指数
1
解决办法
1245
查看次数

staticmethod和classmethod装饰器可以用纯Python实现吗?

这是一个学术问题,不仅仅是一个实际问题.我正在尝试深入研究Python的基础,我想知道:如果我愿意,我可以在纯Python中实现staticmethodclassmethod装饰器吗?

对于staticmethod也许我可以保持一个参照原有的功能,并调用它省略了第一个参数?

对于classmethod也许我可以保持一个参照原有的功能,并把它传递的第一个参数的类型,而不是争论本身?(我怎么处理它直接在课堂上调用?)

同样,并不是我想在我的程序中实际实现它; 我想学习语言是如何运作的.如果有可能,我会非常感谢代码示例.如果没有,我希望解释为什么理论上无法做到.谢谢!

编辑:感谢您的答案和描述符协议的参考!作为进一步扩展我对Python的理解的一种方法,我想再问两件事:

  • 这可以在没有描述符协议的情况下完成,例如在我们的类中实现__ call __特殊方法吗?

  • 描述符协议在Python 2.7和Python 3.x中的工作方式是否相同?

再次感谢!

python static-methods decorator class-method

10
推荐指数
1
解决办法
1781
查看次数

Python:如何从同一个类的类方法中调用实例方法

我有一个课程如下:

class MyClass(object):
    int = None
    def __init__(self, *args, **kwargs):
        for k, v in kwargs.iteritems():
            setattr(self, k, v)

    def get_params(self):
        return {'int': random.randint(0, 10)}

    @classmethod
    def new(cls):
        params = cls.get_params()
        return cls(**params)
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

>>> obj = MyClass.new()
>>> obj.int  # must be defined
9
Run Code Online (Sandbox Code Playgroud)

我的意思是没有创建一个新的实例MyClass,但显然它并不那么简单,因为调用MyClass.new()抛出TypeError: unbound method get_params() must be called with MyClass instance as first argument (got nothing instead)

有没有办法实现这个目标?谢谢

python oop class-method python-2.7

10
推荐指数
1
解决办法
1万
查看次数

在connectedCallback中等待Element Upgrade:FireFox和Chromium差异

2023 年 3 月更新

注意:这是有效的,因为在下一个刻度中,lightDOM 中的N 个(不是全部!)DOM 元素将被解析。

对于 (app.) N > 1000你会遇到麻烦,因为延迟将在解析所有 N 个元素之前结束。

因此,要么添加(大约 20 行)代码来实际检查所有 lightDOM 是否已解析。(但是由于您的 DOM 正在遭受 Obesitas 的困扰,因此您可能还会遇到其他性能问题)

或者只是保持 lightDOM中N 个 DOM 元素的数量较小。

当然,您稍后在解析之后添加的任何 DOM都不会影响任何内容(当不触发时)connectedCallback

2021 年 3 月更新:

FireFox 错误已修复,现在的行为与 Chromium 和 Safari 相同。

这意味着等待 JS EventLoop 为空(带有setTimeoutrequestAnimationFrame)现在connectedCallback是一个跨浏览器方法

connectedCallback(){
 setTimeout(()=>{
   // can access lightDOM here
 }); // ,0 not required
}
Run Code Online (Sandbox Code Playgroud)

事件循环到底是什么?- 菲利普·罗伯茨 …

callback class-method web-component custom-element

10
推荐指数
1
解决办法
1245
查看次数