是什么区别public,private以及protected用C++继承?我在SO上发现的所有问题都涉及具体案例.
Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示:__myPrivateMethod().那么,如何解释这一点呢
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?!
我会对那些没有那么做的人解释一下.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Run Code Online (Sandbox Code Playgroud)
我在那里做的是使用公共方法和私有方法创建一个类并实例化它.
接下来,我称之为公共方法.
>>> obj.myPublicMethod() …Run Code Online (Sandbox Code Playgroud) 我试图理解上的差异之间__getattr__和__getattribute__,但是,我在它失败.
Stack Overflow问题的答案vs 之间的差异__getattr____getattribute__说:
__getattribute__在查看对象的实际属性之前调用,因此正确实现可能很棘手.您最终可以轻松地进行无限递归.
我完全不知道这意味着什么.
然后继续说:
你几乎肯定想要
__getattr__.
为什么?
我读到如果__getattribute__失败,__getattr__就会被调用.那么为什么有两种不同的方法做同样的事情呢?如果我的代码实现了新的样式类,我应该使用什么?
我正在寻找一些代码示例来清除这个问题.我已经用Google搜索了我的能力,但我找到的答案并没有彻底讨论这个问题.
如果有任何文档,我准备阅读.
假设我有一个方法将只读视图返回到成员列表:
class Team {
private List < Player > players = new ArrayList < > ();
// ...
public List < Player > getPlayers() {
return Collections.unmodifiableList(players);
}
}
Run Code Online (Sandbox Code Playgroud)
进一步假设所有客户端都立即迭代一次列表.也许将玩家放入JList或其他东西.客户端就不能存储到列表的引用以便稍后进行检查!
鉴于这种常见情况,我应该返回一个流吗?
public Stream < Player > getPlayers() {
return players.stream();
}
Run Code Online (Sandbox Code Playgroud)
或者在Java中返回非惯用的流?设计的流是否始终在它们创建的同一表达式中"终止"?
我的项目中有两个包:odp.proj和odp.proj.test.我希望某些方法只对这两个包中的类可见.我怎样才能做到这一点?
编辑:如果Java中没有子包的概念,有什么方法可以解决这个问题吗?我有一些方法,我希望只有测试人员和该软件包的其他成员才能使用.我应该把所有东西扔进同一个包里吗?使用广泛的反思?
如果我理解正确,依赖注入的典型机制是通过类的构造函数或通过类的公共属性(成员)注入.
这暴露了注入的依赖性并违反了封装的OOP原则.
我在确定这种权衡时是否正确?你是如何处理这个问题的?
另请参阅下面我对自己问题的回答.
两种设计模式都封装了算法,并将实现细节与其调用类分离.我能辨别的唯一区别是策略模式接受执行参数,而命令模式则没有.
在我看来,命令模式要求所有执行信息在创建时都可用,并且它能够延迟其调用(可能作为脚本的一部分).
什么决定指导是使用一种模式还是另一种模式?
encapsulation design-patterns strategy-pattern command-pattern
encapsulation ×10
oop ×4
abstraction ×2
c++ ×2
java ×2
python ×2
c++-faq ×1
collections ×1
friend ×1
getattr ×1
getattribute ×1
glossary ×1
inheritance ×1
java-8 ×1
java-stream ×1
ooad ×1
package ×1
python-2.7 ×1
visibility ×1