我一直在寻找 的源代码peewee,特别Model是该update函数:https://github.com/coleifer/peewee/blob/a33e8ccbd5b1e49f0a781d38d40eb5e8f344eee5/peewee.py#L4718
我不喜欢这样的事实:如果语句未与子句正确耦合,则任何更新操作都会影响模型中的每一行,可以从行实例调用此方法where。因此,我想找到某种方法来禁止从模型实例调用此类方法。
一些谷歌搜索让我相信这可能相当困难。delattr从__init__似乎没有工作。从 update 函数运行isclass(self)总是返回 True,因为当我们在类方法内部时,我们实际上是类而不是实例。
有什么建议么?
Foo = Class.new
Foo.instance_eval do
def instance_bar
"instance_bar"
end
end
puts Foo.instance_bar #=> "instance_bar"
puts Foo.new.instance_bar #=> undefined method ‘instance_bar’
Run Code Online (Sandbox Code Playgroud)
我的理解是,在对象上调用instance_eval应该允许您为该对象定义实例变量或方法.
但是在上面的示例中,当您在类Foo上调用它来定义instance_bar方法时,instance_bar将成为可以使用"Foo.instance_bar"调用的类方法.很明显,这段代码没有创建实例方法,因为Foo.new.instance_bar导致"未定义的方法'instance_bar'".
为什么instance_eval在此上下文中定义类方法而不是实例方法?
我想做这样的事情:
class SillyWalk(object):
@staticmethod
def is_silly_enough(walk):
return (False, "It's never silly enough")
def walk(self, appraisal_method=is_silly_enough):
self.do_stuff()
(was_good_enough, reason) = appraisal_method(self)
if not was_good_enough:
self.execute_self_modifying_code(reason)
return appraisal_method
def do_stuff(self):
pass
def execute_self_modifying_code(self, problem):
from __future__ import deepjuju
deepjuju.kiss_booboo_better(self, problem)
Run Code Online (Sandbox Code Playgroud)
这个想法是有人可以做的
>>> silly_walk = SillyWalk()
>>> appraise = walk()
>>> is_good_walk = appraise(silly_walk)
Run Code Online (Sandbox Code Playgroud)
还有一些神奇的机器学习正在发生; 最后一点对我来说并不是特别感兴趣,这只是我发现的第一件事,它是在函数上下文和调用者的角度来举例说明静态方法的使用.
无论如何,这不起作用,因为is_silly_enough它实际上不是一个函数:它是一个对象,其__get__方法将返回原始is_silly_enough函数.这意味着它仅在作为对象属性引用时以"正常"方式工作.有问题的对象是由staticmethod()装饰器放入SillyWalk的is_silly_enough属性和最初用该名称定义的函数之间的函数创建的.
这意味着,为了appraisal_method在其中一个 SillyWalk.walk 或它的调用者中使用from 的默认值,我们必须要么
appraisal_method.__get__(instance, owner)(...)而不是打电话appraisal_method(...)类成员函数可以是模板函数,还是必须是静态类函数.基本上可以根据需要在技术上实例化类和功能吗?
使用模板函数作为模板类的成员有什么限制?两者都可以同时完成,还是两者都是?
当我定义一个继承自的新类时NSObject:
@interface Photo : NSObject
{
NSString* caption;
NSString* photographer;
}
@property NSString* caption;
@property NSString* photographer;
@end
Run Code Online (Sandbox Code Playgroud)
是新类继承的所有类方法(如alloc)吗?NSObjectPhoto
有没有办法在vbscript中为每个类创建一个变量?
如果不是,最好的方法是什么呢?前缀在类旁边声明的全局变量?
还有一种方法来声明静态/类方法(对于静态构造函数)或我是否强制为函数添加前缀?
我有以下代码段:
FEED_TYPES = [
('fan_mail', 'Fan Mail'),
('review', 'Review'),
('tip', 'Tip'),
('fan_user', 'Fan User'),
('fan_song', 'Fan Song'),
('fan_album', 'Fan Album'),
('played_song', 'Played Song'),
('played_album', 'Played Album'),
('played_radio', 'Played Radio'),
('new_event', 'New Event'),
]
class Feed:
@classmethod
def do_create(cls, **kwargs):
print kwargs
@classmethod
def create(cls, type, **kwargs):
kwargs['feed_type'] = type
cls.do_create(**kwargs)
for type_tuple in FEED_TYPES:
type, name = type_tuple
def notify(self, **kwargs):
print "notifying %s" % type
self.create(type, **kwargs)
notify.__name__ = "notify_%s" % type
setattr(Feed, notify.__name__, classmethod(notify))
Feed.create("FanMail", to_profile="Gerson", from_profile="Felipe")
Feed.notify_fan_mail(to_profile="Gerson2", …Run Code Online (Sandbox Code Playgroud) NSClassFromString(aClassName)返回名为aClassName的类的类对象.大.
现在如何在该类对象上调用类方法?对于
Class moduleClass = NSClassFromString(aClassName);
Run Code Online (Sandbox Code Playgroud)
Xcode不允许我打电话
AppModule* appModuleClass = moduleClass;
[appModuleClass classMethod] // actually that's an object instance...
Run Code Online (Sandbox Code Playgroud)
要么
[((AppModule)moduleClass) classMethod]; // C-style cast not allowed
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?谢谢.
类方法和静态方法之间是否存在速度差异?我知道不同的用例,但有时我可以完全摆脱类方法,并想知道速度差异
我希望这不是一个愚蠢的问题,但我发现他们导入的classmethod代码和一些他们没有的代码,所以有区别?
我正在使用python 3.6,但我认为最初的代码是用于python 2.7(它使用的from __builtin__ import)
import unittest
from selenium import webdriver
from builtins import classmethod #original code was from __builtin__ import classmethod
class HomePageTest(unittest.TestCase):
@classmethod
def setUp(cls):
# create a new Firefox session
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()
# navigate to the application home page
cls.driver.get("http://demo-store.seleniumacademy.com/")
def test_search_field(self):
pass
#My tests without @classmethod
@classmethod
def tearDown(cls):
# close the browser window
cls.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
Run Code Online (Sandbox Code Playgroud) class-method ×10
python ×5
objective-c ×2
c++ ×1
cpython ×1
decorator ×1
foundation ×1
inheritance ×1
oop ×1
optimization ×1
peewee ×1
ruby ×1
subclass ×1
templates ×1
vbscript ×1