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) 背景资料:
所述PIMPL成语(指针实现)是用于执行隐藏在其中一个公共类包装的结构或类,可以不在库的公共类是的一部分外部看到的技术.
这会隐藏来自库用户的内部实现细节和数据.
在实现这个习惯用法时,为什么要将公共方法放在pimpl类而不是公共类上,因为公共类方法实现会被编译到库中,而用户只有头文件?
为了说明,此代码将Purr()
实现放在impl类上并将其包装起来.
为什么不直接在公共类上实现Purr?
// header file:
class Cat {
private:
class CatImpl; // Not defined here
CatImpl *cat_; // Handle
public:
Cat(); // Constructor
~Cat(); // Destructor
// Other operations...
Purr();
};
// CPP file:
#include "cat.h"
class Cat::CatImpl {
Purr();
... // The actual implementation can be anything
};
Cat::Cat() {
cat_ = new CatImpl;
}
Cat::~Cat() {
delete cat_;
}
Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
printf("purrrrrr");
}
Run Code Online (Sandbox Code Playgroud) 如何在不破坏图像的情况下在jpg或gif等照片文件中写入一些信息?当然没有在照片上显示它,因为整个想法是在任何人未检测到的照片文件中发送信息(在某种程度上提供安全/隐私)!
Ecapsulation和信息隐藏之间究竟有什么区别?
我知道将字段设为私有然后制作字段的setter和getter是ecapsulation.However封装意味着这个?
假设我有一个如下所述的课程.
public Class IsThisEncapsulation
{
public int age;
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
现在是IsThisEncapsulation类是Encapsulation的一个例子吗?
现在是否会让上述类私有领域的'年龄'实现信息隐藏?
能否请您给我一些明确的例子,以帮助我清楚地区分这些概念?
我已经阅读了命令模式,我想我错过了一些东西.Command对象的存在是为了抽象出Receiver对象的细节.在我看来,我们可以简单地停在这里,并保持对Command对象的引用,以在适当的时间执行适当的方法.
那么,为什么需要Invoker呢?这种额外的间接提供了什么优势?我们已经隐藏了命令后面的接收器的细节,那么命令随后被客户端隐藏的动机是什么?
abstraction information-hiding design-patterns command-pattern
我目前正在构建一个ASP.NET MVC项目,NHibernate作为其持久层.
目前,已经实现了一些功能,但只使用本地NHibernate会话:访问数据库(读取或写入)的每个方法都需要使用"using()"子句实例化自己的NHibernate会话.
问题是我想利用NHibernate的延迟加载功能来提高项目的性能.
这意味着每个请求都会打开一个NHibernate会话,直到呈现视图为止.此外,必须支持同时请求(同时多个会话).
我怎样才能尽可能干净地实现这一目标?
我在网上搜索了一下,了解了每个请求的会话模式.我看到的大多数实现使用某种Http*(HttpContext等)对象来存储会话.此外,使用Application_BeginRequest/Application_EndRequest函数很复杂,因为当我只想为每个请求实例化一次会话时,它们会针对每个HTTP请求(aspx文件,css文件,js文件等)被触发.
我担心的是我不希望我的视图或控制器能够访问NHibernate会话(或者更常见的是NHibernate命名空间和代码).这意味着我不想在控制器级别处理会话,也不想在视图级别处理会话.
我有几个选择.哪一个看起来最好?
非常感谢你!
" 抽象和封装是互补的概念:抽象关注于对象的可观察行为......封装集中于产生这种行为的实现......封装通常是通过信息隐藏来实现的,这是隐藏所有内容的过程.物体的秘密对其基本特征没有贡献." - 面向对象分析与设计的Grady Booch
您能否通过信息隐藏向我展示一些有说服力的封装优势的例子?
language-agnostic oop encapsulation abstraction information-hiding
是否真的不可能在jar文件中隐藏某些类?
我希望不允许直接实例化类以使其更灵活.这个罐子里只能看到工厂(或立面).
除了创建两个项目之外,还有其他办法解决这个问题吗?(两个项目:第一个包含类(实现),另一个引用第一个并包含工厂;后面只引用第二个)
...这样浏览反汇编不会立即暴露密码(声明为静态变量).举个例子,想象一个附有zip文件的程序,它必须为资产打开,但不容易被窥探.
我知道完全隐藏或保护拉链是不可能的,但我很好奇有什么方法可以至少阻止一个随意的狙击手.
谢谢!
abstraction ×3
oop ×3
c++ ×2
java ×2
asp.net-mvc ×1
assembly ×1
facade ×1
gif ×1
glossary ×1
image ×1
jar ×1
jpeg ×1
nhibernate ×1
ooad ×1
pimpl-idiom ×1
python ×1
python-2.7 ×1
session ×1