我只是想简化我的一个类,并引入了一些与flyweight设计模式相同的功能.
但是,我有点困惑,为什么__init__
总是被称为__new__
.我没想到这个.任何人都可以告诉我为什么会这样,以及我如何能够实现这个功能呢?(除了将实施放入__new__
感觉相当hacky之外.)
这是一个例子:
class A(object):
_dict = dict()
def __new__(cls):
if 'key' in A._dict:
print "EXISTS"
return A._dict['key']
else:
print "NEW"
return super(A, cls).__new__(cls)
def __init__(self):
print "INIT"
A._dict['key'] = self
print ""
a1 = A()
a2 = A()
a3 = A()
Run Code Online (Sandbox Code Playgroud)
输出:
NEW
INIT
EXISTS
INIT
EXISTS
INIT
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在开发一个大型项目(对我来说),它将有许多类,需要可扩展,但我不知道如何规划我的程序以及类需要如何交互.
我在几个学期后参加了OOD课程并从中学到了很多东西; 比如编写UML,并将需求文档翻译成对象和类.我们也学习了序列图,但不知怎的,我错过了讲座或其他什么,他们并没有真正坚持我.
在以前的项目中,我尝试过使用从课程中学到的方法,但通常最终得到的代码一旦我能说"是的,看起来像我的想法"我不想挖掘泥土添加新功能.
我有一份史蒂夫麦康奈尔的代码完整副本,我不断听到这里和其他地方都很棒.我阅读了有关设计的章节,似乎没有提供我正在寻找的信息.我知道他说这不是一个削减和干燥的过程,它主要基于启发式,但我似乎无法将他的所有信息都应用到我的项目中.
那么你在高级设计阶段(开始编程之前)做了些什么来确定你需要什么类(特别是那些不基于任何"真实世界对象"的类)以及它们如何相互作用?
具体来说,我对您使用的方法感兴趣?您遵循的流程是什么,通常会形成一个良好,干净的设计,能够代表最终产品?
我正处于开发学习的某个阶段,我觉得我必须更多地了解接口.
我经常阅读它们,但似乎我无法掌握它们.
我已经阅读过这样的例子:动物基类,IAnimal界面,如'Walk','Run','GetLegs'等等 - 但我从来没有做过某些事情,感觉就像"嘿我应该使用界面这里!"
我错过了什么?为什么我要掌握这么难的概念!我只是因为我可能没有意识到对一个人的具体需求而感到害怕 - 主要是由于理解它们的一些缺失方面!这让我觉得自己在成为开发者方面缺少一些东西!如果有人有过这样的经历并取得了突破,我会很感激如何理解这个概念.谢谢.
在PHP5中,使用const
和有static
什么区别?什么时候适合?和什么样的作用呢public
,protected
和private
游戏-如果有的话.
我在以前的问题上有一些非常棒的帮助来检测爪子内的爪子和脚趾,但所有这些解决方案一次只能用于一次测量.
现在我有数据包含:
显然将所有内容都放在一个大对象上并不会削减它,所以我认为我需要使用类而不是当前的大量函数.但即使我已经阅读了学习Python关于类的章节,我也无法将其应用于我自己的代码(GitHub链接)
我还觉得每次想要获取一些信息时处理所有数据都很奇怪.一旦我知道每只爪子的位置,我就没有理由再次计算它.此外,我想比较同一只狗的所有爪子,以确定哪个接触属于哪个爪子(前/后,左/右).如果我继续只使用功能,这将变得一团糟.
所以现在我正在寻找关于如何创建类的建议,让我以合理的方式处理我的数据(链接到一条狗的压缩数据).
我从头开始一个新项目,希望它干净/具有良好的编码标准.经验丰富的开发人员会以什么样的顺序在课堂上做出贡献?
答:1)公共方法2)私人方法3)公共变量4)私有变量
B:1)公共变量2)私有变量3)公共方法4)私有方法
C:1)公共变量2)公共方法3)私有方法4)私有变量
我通常喜欢将公共静态变量放在顶部,但是然后会在构造函数之前列出公共静态方法,还是应该首先列出构造函数?诸如此类的事情...
我知道这很有点但我只是想知道:这是什么最好的做法?
PS:不,我不使用Cc#.我知道.我是个luddite.
当以面向对象的方式实现大海捞针搜索时,您基本上有三种选择:
1. needle.find(haystack)
2. haystack.find(needle)
3. searcher.find(needle, haystack)
Run Code Online (Sandbox Code Playgroud)
你更喜欢哪个?为什么?
我知道有些人更喜欢第二种选择,因为它避免引入第三种物体.然而,我不禁感到第三种方法在概念上更"正确",至少如果你的目标是塑造"现实世界".
在哪种情况下,您认为引入辅助对象是合理的,例如本例中的搜索器,何时应避免使用?
我想为类名创建一个别名.以下语法将是完美的:
public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
...
}
public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;
Run Code Online (Sandbox Code Playgroud)
但它不会编译.
注意此示例仅供参考.不要试图通过建议改变整个系统的设计来解决这个特殊问题.此示例的存在或缺乏不会改变原始问题.
一些现有代码依赖于静态类的存在:
public static class ColorScheme
{
...
}
Run Code Online (Sandbox Code Playgroud)
此配色方案是Outlook 2003配色方案.我想介绍一个Outlook 2007配色方案,同时保留Outlook 2003配色方案:
public static class Outlook2003ColorScheme
{
...
}
public static class Outlook2007ColorScheme
{
...
}
Run Code Online (Sandbox Code Playgroud)
但我仍然面临这样一个事实,即代码依赖于名为ColorScheme的静态类的存在.我的第一个想法是创建一个ColorScheme类,我将从Outlook2003或Outlook2007下载:
public static class ColorScheme : Outlook2007ColorScheme
{
}
Run Code Online (Sandbox Code Playgroud)
但你不能从静态类下降.
我的下一个想法是创建静态ColorScheme类,但使Outlook2003ColorScheme和Outlook2007ColorScheme类非静态.然后静态ColorScheme类中的静态变量可以指向"true"颜色方案:
public static class ColorScheme
{
private static CustomColorScheme = new Outlook2007ColorScheme();
...
}
private class CustomColorScheme
{
...
}
private class Outlook2008ColorScheme : CustomColorScheme
{
...
} …
Run Code Online (Sandbox Code Playgroud) class-design ×10
oop ×5
c# ×2
interface ×2
python ×2
architecture ×1
coding-style ×1
constants ×1
diagram ×1
object ×1
php ×1
uml ×1