我在Go上看到过相当多的博客和视频,据我所知,在编写方法时,没有一个作者使用"self"或"this"作为receiver变量.然而,有关堆栈溢出的问题似乎有很多问题,这让我想到如果将变量命名为"self"这是否具有误导性?
读取方法集的规范并不提供任何证据(在我的解释中).
我似乎记得在某个地方发现它不是真正的自我指针,任何人都可以列出证据或提供任何推理方式,如果有任何问题/陷阱可能会因为将其视为"自我"而产生?
一个简单的例子:
type MyStruct struct {
Name string
}
Run Code Online (Sandbox Code Playgroud)
哪种方法更合适,或两者兼而有之?
func (m *MyStruct) MyMethod() error {
// do something useful
}
Run Code Online (Sandbox Code Playgroud)
要么
func (self *MyStruct) MyMethod() error {
// do something useful
}
Run Code Online (Sandbox Code Playgroud) 我是Swift的新手,我想知道用什么self和为什么.
我已经在类和结构中看到了它,但我真的发现它们不是必需的,甚至没有必要在我的代码中提到它们.它们用于什么以及为什么?在什么情况下有必要使用它?
我一直在阅读这个问题的许多问题和答案,但没有一个能完全回答我的问题,而且他们总是倾向于将它与thisJava 相比较,我对此并不熟悉.
我有一个类A,它由一堆其他类继承.其中一些函数有一些相似的函数,将这些函数定义在其他地方并由需要它们的类调用会很好.但是这些函数调用超类中定义的函数.
class A():
def imp_func(*args):
# called by the child class functions
Class B(A):
def common_func(self):
# some stuff
self.imp_func(*args)
Run Code Online (Sandbox Code Playgroud)
所以我创建了我的辅助函数,它将self object参数作为参数,我可以imp_func在辅助函数中调用from.
def helper_func(obj, some_args):
# some common stuff
obj.imp_func(*args)
class B(A):
def common_func(self):
# unique stuff
helper_func(self, some_args)
Run Code Online (Sandbox Code Playgroud)
这解决了这个问题.
但我应该这样做吗?这是Pythonic吗?
考虑这个小例子:
import datetime as dt
class Timed(object):
def __init__(self, f):
self.func = f
def __call__(self, *args, **kwargs):
start = dt.datetime.now()
ret = self.func(*args, **kwargs)
time = dt.datetime.now() - start
ret["time"] = time
return ret
class Test(object):
def __init__(self):
super(Test, self).__init__()
@Timed
def decorated(self, *args, **kwargs):
print(self)
print(args)
print(kwargs)
return dict()
def call_deco(self):
self.decorated("Hello", world="World")
if __name__ == "__main__":
t = Test()
ret = t.call_deco()
Run Code Online (Sandbox Code Playgroud)
打印
Hello
()
{'world': 'World'}
Run Code Online (Sandbox Code Playgroud)
为什么self参数(应该是Test obj实例)不作为第一个参数传递给装饰函数decorated?
如果我手动完成,例如:
def call_deco(self):
self.decorated(self, "Hello", …Run Code Online (Sandbox Code Playgroud) 我是编码的新手,并选择了一些开源项目来获得这个想法.
我收到错误:
对成员'下标'的模糊引用
在下面的代码中:
let pictures = ( selectedRestaurant["Pictures"] as! NSArray ) // Error
let picture = ( pictures[zoomedPhotoIndex] as! NSDictionary )
let pictureURL = picture["url"] as! String
let imageURL = NSURL(string: pictureURL)
let urlRequest = NSURLRequest(URL: imageURL!)
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) {
response, data, error in
if error == nil && data != nil {
self.imageView.image = UIImage(data: data!)
self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
}
}
Run Code Online (Sandbox Code Playgroud) 我可以通过下面的代码访问函数内部的python函数的属性:
def aa():
print aa.__name__
print aa.__hash__
# other simliar
Run Code Online (Sandbox Code Playgroud)
但是,如果上面的aa()函数是用于编写其他代码的模板,比方说bb(),我必须写:
def bb():
print bb.__name__
print bb.__hash__
# other simliar
Run Code Online (Sandbox Code Playgroud)
是否有类似于self类方法中的参数的"指针",所以我可以编写这样的代码?
def whatever():
print self.__name__
print self.__hash__
# other simliar
Run Code Online (Sandbox Code Playgroud)
我搜索并发现有人说使用该类来解决这个问题,但重新定义所有现有功能可能会有麻烦.有什么建议?
我来自C++世界所以分配的概念this让我不寒而栗:
this = new Object; // Gah!
Run Code Online (Sandbox Code Playgroud)
但是在Objective-C中有一个类似的关键字,self这是完全可以接受的:
self = [super init]; // wait, what?
Run Code Online (Sandbox Code Playgroud)
许多示例Objective-C代码在init例程中使用上述行.我的问题:
1)为什么赋值self有意义(答案如"因为语言允许它"不计算)
2)如果我不在self我的init日常工作中分配会怎样?我是否将我的实例置于某种危险之中?
3)当以下if语句失败时,它意味着什么,我该怎么做才能从中恢复:
- (id) init
{
self = [super init];
if (self)
{
self.my_foo = 42;
}
return self;
}
Run Code Online (Sandbox Code Playgroud) 你是否应该self在Python中引用成员函数时使用(在同一模块中)?
更一般地说,我想知道什么时候需要使用self,不仅仅是方法,还有变量.
所以我刚开始用python编程,我不明白"自我"背后的整个推理.我知道它几乎像一个全局变量一样使用,因此数据可以在类中的不同方法之间传递.当你在同一个类中调用另一个方法时,我不明白为什么你需要使用它.如果我已经上课,为什么我要告诉它?
例如,如果我有:为什么我需要self.thing()?
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
Run Code Online (Sandbox Code Playgroud) 我很难理解OO Perl的交集.my $self = shift;关于这些单独元素的文档很棒,但是我发现它们都没有触及它们如何协同工作.
我一直在使用Moose来创建具有属性的模块,当然,在所述模块中引用模块的属性是有用的.我一遍又一遍地被告知要my $self = shift;在子程序中使用将模块的属性分配给该变量.这是有道理和有效的,但是当我也将参数传递给子例程时,这个过程显然需要@ARGV数组的第一个元素并将它分配给它$self.
有人可以解释我如何使用shift来获取模块属性的内部访问权限,同时还传入@ARGV数组中的参数?