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
我有一个包含这个类方法的类:
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
.( …
我有以下代码:
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中有一个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方法创建一个实例,但也要更新类的属性.有没有比上面的代码更优雅的方式来做到这一点?我试图传递self
和cls
到init方法,然后参照CLS,而不是宠物,其中num_pets递增,但没有奏效.
我有一系列"策略"对象,我认为这些对象可以作为一组策略类的类方法实现.我为此指定了一个协议,并创建了符合的类(如下所示)
@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:在协议中找不到(所以它假定它是一个实例方法,我想调用一个类方法).但是,由于我的数组中的对象是类的实例,它们现在就像实例方法(或者概念上它们应该是).
有没有一种神奇的方法来调用类方法?或者这只是一个坏主意,我应该只创建我的策略对象的实例(而不是使用类方法)?
>>> 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)
但我认为在检索属性时,这与描述符有关.我不认为这与设置属性有很大关系.
我正在查看CocoaHTTPServer项目的源代码,更具体地说是HTTPServer.m
文件,我只是不明白这一行:
connectionClass = [HTTPConnection self];
Run Code Online (Sandbox Code Playgroud)
这是做什么的(它在任何地方记录)?它甚至如何编译?不应该
connectionClass = [HTTPConnection class];
Run Code Online (Sandbox Code Playgroud) 这是一个学术问题,不仅仅是一个实际问题.我正在尝试深入研究Python的基础,我想知道:如果我愿意,我可以在纯Python中实现staticmethod
和classmethod
装饰器吗?
对于staticmethod
也许我可以保持一个参照原有的功能,并调用它省略了第一个参数?
对于classmethod
也许我可以保持一个参照原有的功能,并把它传递的第一个参数的类型,而不是争论本身?(我怎么处理它直接在课堂上调用?)
同样,并不是我想在我的程序中实际实现它; 我想学习语言是如何运作的.如果有可能,我会非常感谢代码示例.如果没有,我希望解释为什么理论上无法做到.谢谢!
编辑:感谢您的答案和描述符协议的参考!作为进一步扩展我对Python的理解的一种方法,我想再问两件事:
这可以在没有描述符协议的情况下完成,例如在我们的类中实现__ call __特殊方法吗?
描述符协议在Python 2.7和Python 3.x中的工作方式是否相同?
再次感谢!
我有一个课程如下:
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)
有没有办法实现这个目标?谢谢
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 为空(带有setTimeout
或requestAnimationFrame
)现在connectedCallback
是一个跨浏览器方法
connectedCallback(){
setTimeout(()=>{
// can access lightDOM here
}); // ,0 not required
}
Run Code Online (Sandbox Code Playgroud)
事件循环到底是什么?- 菲利普·罗伯茨 …
class-method ×10
python ×5
objective-c ×2
oop ×2
ruby ×2
callback ×1
class ×1
decorator ×1
httpserver ×1
python-2.7 ×1