在思考Java/C#中的编程时,我想知道如何在内存中表示属于对象的方法,以及这个事实如何涉及多线程.
我试着对这些问题下定决心,但我对他们的答案非常不确定.
我遇到了以下有趣的结构:
假设您有一个列表列表如下:
my_list = [['captain1', 'foo1', 'bar1', 'foobar1'], ['captain2', 'foo2', 'bar2', 'foobar2'], ...]
Run Code Online (Sandbox Code Playgroud)
并且你想用0-index元素作为键来创建一个字典.一个方便的方法是:
my_dict = {x.pop(0): x for x in my_list}
# {'captain1': ['foo1', 'bar1', 'foobar1'], ...}
Run Code Online (Sandbox Code Playgroud)
看起来,pop在将list x作为值分配之前,这就是为什么'captain'不出现在值中(它已经弹出)
现在让我们更进一步,尝试获得如下结构:
# {'captain1': {'column1': 'foo1', 'column2': 'bar1', 'column3': 'foobar1'}, ...}
Run Code Online (Sandbox Code Playgroud)
为此,我写了以下内容:
my_headers = ['column1', 'column2', 'column3']
my_dict = {x.pop(0): {k: v for k, v in zip(my_headers, x)} for x in my_list}
Run Code Online (Sandbox Code Playgroud)
但是这会返回:
# {'captain1': {'col3': 'bar1', 'col1': 'captain1', 'col2': 'foo1'}, 'captain2': {'col3': 'bar2', …Run Code Online (Sandbox Code Playgroud) 为什么这两个实现的行为不同?在评估他们的原型时,究竟是什么让他们与众不同?
使用指定的原型创建对象:
function Foo() {}
// creates an object with a specified prototype
var bar = Object.create(Foo);
console.log(Object.getPrototypeOf(bar)); // returns: function Foo(){}
console.log(Foo.isPrototypeOf(bar)); // returns: true
Run Code Online (Sandbox Code Playgroud)
使用构造方法创建对象:
function Foo() {}
// creates an object with the constructor method
var bar = new Foo();
console.log(Object.getPrototypeOf(bar)); // returns: Foo {}
console.log(Foo.isPrototypeOf(bar)); // returns: false
Run Code Online (Sandbox Code Playgroud)
另外,为什么第二个实现返回Foo {}和false?
我一直听到大多数与节目相关的网站上的声明:
编程到接口而不是实现
但是我不明白其含义?
例子会有所帮助.
编辑:我收到了很多好的答案,所以你可以用一些代码片段来补充它,以便更好地理解这个主题.谢谢!
如果我在Python中有一个字典,并且我遍历它一次,然后再次,那么迭代顺序是否保证保留,因为我没有插入,删除或更新字典中的任何项目?(但我可能已经做过查找).
这个问题涉及基本相同代码的2种不同实现.
首先,使用委托创建一个比较方法,该方法可以在排序对象集合时用作参数:
class Foo
{
public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
{
return foo1.Bar.CompareTo(foo2.Bar);
};
}
Run Code Online (Sandbox Code Playgroud)
当我想要一种以与CompareTo函数提供的方式不同的方式对Foo对象的集合进行排序时,我使用上述方法.例如:
List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);
Run Code Online (Sandbox Code Playgroud)
二,使用IComparer:
public class BarComparer : IComparer<Foo>
{
public int Compare(Foo foo1, Foo foo2)
{
return foo1.Bar.CompareTo(foo2.Bar);
}
}
Run Code Online (Sandbox Code Playgroud)
当我想在Foo对象的集合中对Foo对象进行二进制搜索时,我使用上面的代码.例如:
BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
有什么意义
enum SomeEnum : byte // <----
{
SomeValue = 0x01,
...
}
Run Code Online (Sandbox Code Playgroud)
当你必须进行转换只是为了将它分配给与枚举基础类型相同类型的变量?
byte b = (byte)SomeEnum.SomeValue;
Run Code Online (Sandbox Code Playgroud) 以下代码在执行时打印nitesh null而不是预期nitesh 130.为什么n在执行静态块之前没有初始化?
class test
{
static
{
System.out.println(test.str+" "+test.n);
}
final static String str="nitesh";
final static Float n=130f;
public static void main(String []args)
{
}
}
Run Code Online (Sandbox Code Playgroud) class Foo(object):
def tick(self):
print("something")
class Bar(object):
def __init__(self):
self.foo = Foo()
def tick(self):
#Here's what I do....
self.foo.tick()
#here's what my goal would be
self.foo()
b = Bar()
b.tick()
Run Code Online (Sandbox Code Playgroud)
这基本上是我的目标.从我收集到的内容中我可以将tick功能更改为__call__,这样我就可以按照自己的意愿行事.其他几个答案说这会产生一个对象的新实例,这是否意味着它会使用self.foo的内存?或者它会成为一个全新的对象,新实例?或制作self.foo的副本?
此外还有一些缺点,可能会或可能不会表现出来.对于我的程序的特定部分,我检查对象是否有一个__call__来确定我传递的参数是函数还是变量,我真的不认为我想要允许它被调用(尽管如此,我认为该类在技术上将是一个函数.)有没有办法区分函数和可调用类?
还有什么能使这种做法变得不受欢迎(这是一种pythonic的工作方式吗?)?我的下一个想法是,鉴于其他变量前缀为__cant,在类之外使用,但这似乎不是这里的情况.
在阅读了一些非常基本的haskell后,我知道如何使用bind "链接"monadic动作,如:
echo = getLine >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
(>>=) 运算符在这种方式下非常方便,但是如果我想链接带有多个参数的monadic动作(或仿函数)呢?
鉴于(>>=) :: m a -> (a -> m b) -> m b它似乎(>>=)只能提供一个论点.
例如,writeFile接受两个参数(a FilePath和内容).假设我有一个返回a的monadic动作FilePath,以及另一个返回String写入的动作.如何在writeFile不使用do-notation的情况下将它们组合在一起,但是以一般方式?
是否有任何类型的功能: m a -> m b -> (a -> b -> m c) -> m c可以做到这一点?