所以只是为了建立,我觉得我理解复制模块中的copy
vs 之间的区别deepcopy
,我已经使用过copy.copy
并且copy.deepcopy
成功之前,但这是我第一次真正去重载__copy__
和__deepcopy__
方法.我已经围绕谷歌搜索,并通过看内置的Python模块查找的实例__copy__
和__deepcopy__
功能(例如sets.py
,decimal.py
和fractions.py
),但我仍然肯定不是100%我已经得到了它的权利.
这是我的情景:
我有一个配置对象,它主要由简单属性组成(尽管它可能包含其他非基本对象的列表).最初,我将使用一组默认值来实例化一个配置对象.此配置将切换到多个其他对象(以确保所有对象以相同的配置启动).然而,一旦用户交互开始,每个对象将需要能够独立地调整配置而不影响彼此的配置(对我来说,我需要使用我的初始配置的深度复制来处理).
这是一个示例对象:
class ChartConfig(object):
def __init__(self):
#Drawing properties (Booleans/strings)
self.antialiased = None
self.plot_style = None
self.plot_title = None
self.autoscale = None
#X axis properties (strings/ints)
self.xaxis_title = None
self.xaxis_tick_rotation = None
self.xaxis_tick_align = None
#Y axis properties (strings/ints)
self.yaxis_title = None
self.yaxis_tick_rotation = None
self.yaxis_tick_align = None
#A list of non-primitive objects
self.trace_configs = [] …
Run Code Online (Sandbox Code Playgroud) 我正在编写Python库API,我经常遇到我的用户想要相同函数和变量的多个不同名称的场景.
如果我有一个带有该函数的Python类,foo()
并且我想为它调用别名,那就bar()
太容易了:
class Dummy(object):
def __init__(self):
pass
def foo(self):
pass
bar = foo
Run Code Online (Sandbox Code Playgroud)
现在我可以毫无问题地做到这一点:
d = Dummy()
d.foo()
d.bar()
Run Code Online (Sandbox Code Playgroud)
我想知道的是,使用作为常规变量(例如字符串)的类属性而不是函数的最佳方法是什么?如果我有这段代码:
d = Dummy()
print d.x
print d.xValue
Run Code Online (Sandbox Code Playgroud)
我想d.x
和d.xValue
以ALWAYS打印同样的事情.如果d.x
改变,它也应该改变d.xValue
(反之亦然).
我可以想到很多方法可以做到这一点,但它们都没有像我想的那样顺利:
@property
注释并弄乱setter__setattr__
类函数以下哪种方式最好?或者还有另一种方式吗?我不禁觉得,如果为函数创建别名很容易,那对于任意变量来说应该很容易......
仅供参考:我使用的是Python 2.7.x,而不是Python 3.0,因此我需要一个兼容Python 2.7.x的解决方案(尽管如果Python 3.0可以直接解决这个问题,我会感兴趣).
谢谢!
作为背景,我不久前给出了这篇文章的答案:
它无意中开始了一个关于指针与C++中的数组的长链注释链,因为我试图过度简化并且我做了"数组是指针"的声明.虽然我的最终答案听起来相当不错,但只是在对我收到的很多评论进行了大量编辑之后.
这个问题并不是拖钓诱饵,我理解指针和数组不是一回事,但C++语言中的一些可用语法肯定会使它们在很多情况下表现得非常相似.(仅供参考,我的编译器已i686-apple-darwin9-g++-4.0.1
开启OS X 10.5.8
)
例如,这段代码编译并运行就好了(我意识到这x[8]
是一个潜在的分段错误):
//this is just a simple pointer
int *x = new int;
cout << x << " " << (*x) << " " << x[8] << endl; //might segfault
//this is a dynamic array
int* y = new int[10];
cout << y << " " << (*y) << " " << y[8] << endl;
//this is a static array
int z[10];
cout << z << " " << …
Run Code Online (Sandbox Code Playgroud) 所以我将在即将到来的学期在一所大学教授第二学期的新生C + +课程.学生们已经使用了数组(虽然只是静态分配)并且有一些引用和指针的概念(但可能不多).一般来说,他们没有做过大量的动态内存分配和管理.我试图利用Stack Overflow社区的全球智能,在您的集体经验中,看到了向年轻的计算机科学专业学生提供指针和记忆管理等方法的最有效方法?
在相关主题上有很多有趣的StackOverflow帖子:
我当然对我教的方式和内容有自己的一套看法,但我真的对我的方法与你的方法有什么不同感兴趣.一些要考虑的子问题(你肯定不限于这些):
你会教什么命令以及如何将这些主题联系起来?"普通"堆栈变量,后跟引用,后跟指针?数组在哪里适合?你什么时候介绍"新"关键字?等等
您看到哪些视觉辅助工具最能表达这些概念?例如,内存值的内存位置的绘图框和变量/指针的名称,箭头指向框?你读过的任何特定的网站或教科书是否有优秀的描述?
是否有特定的代码示例(例如"交换"功能)往往比其他代码更好地获取信息?
教!
试图将其与我发布的一些链接区分开来:
我发布的大多数以前的SO链接都非常直接关注指针.虽然指针是理解记忆行为的一个组成部分,但我对学生如何理解记忆如何运作的更为全面的主题感兴趣.我们如何最好地说明正常,指针和引用声明之间的差异?我们如何强调全局,堆栈和堆变量之间的差异?我认为即使将返回地址推送到调用堆栈也是公平的游戏.您认为内存管理最重要的方面是什么,如何将它们组合在一起,以及如何以一致的方式实现这一目标?
我们上周在一个基于Java,Hibernate的大型系统中遇到了一个问题.我们的后端MySQL数据库(托管在Amazon RDS上)没有响应5-10分钟(它仍然会接受连接,但由于硬件问题,其写入吞吐量降至零).这段代码:
getSession().save(entity); //session is an instance of org.hibernate.Session
Run Code Online (Sandbox Code Playgroud)
结束悬挂约8.5分钟.很明显,在我的特定场景中,需要在此语句上使用某种超时条件使其失败.我不能保证将来我不会看到类似的硬件问题.
我应该提一下,我仍然是Hibernate的新手,所以我可能不理解使用save()
与使用Criteria,Transactions等之间的关联.所以我发现了以下内容:
hibernate.c3p0.timeout
可用于在C3P0连接池上设置连接超时getSession().getTransaction().setTimeout(...)
可用于超时事务getSession().createQuery(...).setTimeout(...)
可用于超时查询javax.persistence.query.timeout
,但我不完全确定它是我想要的(我也不认为我的Hibernate版本足够新)这些似乎都不是我想做的(除了JPA 2之外).这看起来应该非常简单.这里有什么我想念的吗?
谢谢!
我们的代码库中有一个类,它synchronized
在方法级别使用关键字来确保多线程操作中的数据一致性.它看起来像这样:
public class Foo
{
public synchronized void abc() { ... }
public synchronized void def() { ... }
//etc.
}
Run Code Online (Sandbox Code Playgroud)
关于这一点的好处是任何使用该类的人都可以免费获得同步.当您创建实例时Foo
,您不必记住在synchronized
块内或类似的内容中访问它.
不幸的是,似乎方法级别的同步不会再削减它.相反,我们将不得不开始Foo
自己同步.我认为任何事情都不会java.util.concurrent.AtomicReference
削减它.我想确保没有其他人触及某个Foo
特定(可能有点冗长)操作的实例.所以现在我们将在代码中使用这样的块:
Foo foo = new Foo(); //this got created somewhere
//somewhere else entirely
synchronized(foo)
{
//do operation on foo
foo.doStuff();
foo.doOtherStuff();
}
Run Code Online (Sandbox Code Playgroud)
所以我担心的主要问题是一些开发人员和我分享这些代码. Foo
对象相当普遍.由于我们不再在方法级别获得免费同步,因此我们必须始终记住访问块中的Foo
对象synchronized
.
所以我的问题是,是否有在Java中任何机制(内置或第三方),让我产生在编译时警告或错误,如果实例Foo
一个外部访问synchronized
块?
理想情况下,我可以对类声明做一些事情(下面的例子):
@EnsureSynchronized
public class Foo
{
//etc.
}
Run Code Online (Sandbox Code Playgroud)
或者当我声明Foo …
我正在使用Python/Tkinter构建基于GUI的应用程序,该应用程序构建在现有的Python bdb模块之上.在这个应用程序中,我想从控制台静默所有stdout/stderr并将其重定向到我的GUI.为了达到这个目的,我编写了一个专门的Tkinter.Text对象(帖子末尾的代码).
基本的想法是,当某些内容写入sys.stdout时,它会在"Text"中显示为黑色的一行.如果向sys.stderr写入了某些内容,它会在"Text"中显示为红色的一行.只要写入了某些内容,文本就会向下滚动以查看最新的行.
我目前正在使用Python 2.6.1.在Mac OS X 10.5上,这看起来效果很好.我没有遇到任何问题.但是,在RedHat Enterprise Linux 5上,我非常可靠地在脚本运行期间遇到分段错误.分段错误并不总是出现在同一个地方,但几乎总是会发生.如果我从代码中注释掉sys.stdout=
和sys.stderr=
行,那么分段错误似乎就会消失.
我确信还有其他方法可以解决这个问题,但是有人能看到我在这里做的任何明显错误的事情可能导致这些分段错误吗?这让我疯了.谢谢!
PS - 我意识到将sys.stderr重定向到GUI可能不是一个好主意,但即使我只重定向sys.stdout而不是sys.stderr,我仍然会出现分段错误.我也意识到我现在允许文本无限增长.
class ConsoleText(tk.Text):
'''A Tkinter Text widget that provides a scrolling display of console
stderr and stdout.'''
class IORedirector(object):
'''A general class for redirecting I/O to this Text widget.'''
def __init__(self,text_area):
self.text_area = text_area
class StdoutRedirector(IORedirector):
'''A class for redirecting stdout to this Text widget.'''
def write(self,str):
self.text_area.write(str,False)
class StderrRedirector(IORedirector):
'''A class for redirecting stderr to this Text widget.'''
def write(self,str):
self.text_area.write(str,True) …
Run Code Online (Sandbox Code Playgroud) 所以我在SO和其他地方阅读了很多相关的帖子,例如:
对我来说,在32位系统上,我期望4字节指针,在64位系统上,我期望8字节指针.所以我正在运行这段代码:
int main()
{
cout << "sizeof(int) = " << sizeof(int) << endl;
cout << "sizeof(void*) = " << sizeof(void*) << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是相应的输出:
sizeof(int) = 4
sizeof(void*) = 8
Run Code Online (Sandbox Code Playgroud)
我在Mac OS X 10.6.1上以32位模式运行.这是"uname -a"的输出:
Darwin brent-nashs-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386 i386
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的g ++版本(系统附带的默认版本):
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Run Code Online (Sandbox Code Playgroud)
所以我意识到指针的大小不能保证从系统到系统,并且它们完全依赖于编译器和体系结构,但这种结果是否会使其他人感到不合逻辑呢?这只是Mac OS X 10.6或我的设置的特质吗?还是有一个很好的理由我看到这么大的指针?
==================================================
任何想要他们的人的额外细节......
我最初使用此命令行编译:
g++ -Wall -o TestClass1 TestClass1.cpp
Run Code Online (Sandbox Code Playgroud)
它产生了这个输出:
sizeof(int) = 4
sizeof(void*) …
Run Code Online (Sandbox Code Playgroud) 我正在研究霍夫曼.但我发现PriorityQueue的排序算法存在问题; 它没有足够的比较!然后我写了一个简单的类来测试Collections的排序和PriorityQueue的排序:
public class Student implements Comparable<Student>{
String name;
int score;
int math;
public Student(int score, int math, String name) {
this.name = name;
this.score = score;
this.math = math;
}
public int compareTo(Student other) {
if (this.score > other.score) {
return -1;
} else if (this.score < other.score) {
return 1;
} else {
if (this.math > other.math) {
return -1;
} else {
return 1;
}
}
return 0;
}
public String toString() {
return("[" + name + …
Run Code Online (Sandbox Code Playgroud)