我只是想知道,如何隐藏特殊
__.*__
Run Code Online (Sandbox Code Playgroud)
python*中的方法?特别是我正在使用带tab-completion的交互式python解释器,我想只显示我的模块公开的方法...
谢谢,
/ myyn /
*(至少来自使用python shell的用户)
现在看起来像这样:
h[2] >>> Q.
Q.ALL( Q.__delattr__( Q.__getattribute__(
Q.__package__ Q.__sizeof__( Q.find_values(
Q.json
Q.DEFAULT_CONDITION( Q.__dict__ Q.__hash__(
Q.__reduce__( Q.__str__( Q.get_loops_total_platform(
Q.jsonlib
Q.SUCCESSFUL( Q.__doc__ Q.__init__(
Q.__reduce_ex__( Q.__subclasshook__( Q.get_platforms(
Q.memoize(
Q.__all__ Q.__file__ Q.__name__
Q.__repr__( Q.cached_open( Q.get_snippets(
Q.__class__( Q.__format__( Q.__new__(
Q.__setattr__( Q.find_results( Q.get_subjects(
h[2] >>> Q.
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像:
h[2] >>> Q.
Q.ALL( Q.find_values( Q.json
Q.DEFAULT_CONDITION( Q.get_loops_total_platform(
Q.jsonlib Q.SUCCESSFUL( Q.get_platforms(
Q.memoize( Q.cached_open( Q.get_snippets(
Q.find_results( Q.get_subjects(
h[2] >>> Q.
Run Code Online (Sandbox Code Playgroud) 在C#4.0中,有一个新的DynamicObject.
它提供了一个"魔术方法"TryInvokeMember(),它在尝试调用不存在的方法时被调用.
我想知道的是,当尝试从定义类之外调用受保护的方法时,是否调用TryInvokeMember().
我将这种行为与PHP形成对比,PHP在这种情况下确实调用了它的等效"魔术方法"__call().
我有一个定制的MVC PHP框架,我正在重写,并对性能和魔术方法有疑问.使用框架的模型部分,我在想是否__get/ __setmagic方法会导致太多的性能损失值得使用.我的意思是访问(读取和写入)模型数据将是最常见的事情之一.对于像MVC框架的模型部分这样的大量使用功能,__get/ __setmagic方法的使用是否太大了?
快速规格:
PHP 5.3
error_reporting(-1) // the highest
Run Code Online (Sandbox Code Playgroud)
我正在使用__get()引用技巧来神奇地访问对象中任意深度的数组元素.
快速举例:
public function &__get($key){
return isset($this->_data[$key])
? $this->_data[$key]
: null;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为$key没有设置,它试图null通过引用返回,当然抛出Only variable references should be returned by reference ...我尝试修改它如下:
public function &__get($key){
$null = null;
return isset($this->_data[$key])
? $this->_data[$key]
: $null;
}
Run Code Online (Sandbox Code Playgroud)
仍然没有工作,虽然,我假设设置$null到null实质上unset()这样.
我能做什么?谢谢!
刚想我会推广这个问题,因为它有点相关(PHP魔术和参考); __callStatic(),call_user_func_array(),引用和PHP 5.3.1.我还没有找到答案...除了修改PHP核心.
class Dog {
protected $bark = 'woof!';
public function __get($key) {
if (isset($this->$key)) {
return $this->$key;
}
}
public function __set($key, $val) {
if (isset($this->$key)) {
$this->$key = $val;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用这些功能有什么意义.
如果我可以使用
$dog = new Dog();
$dog->bark = 'woofy';
echo $dog->bark;
Run Code Online (Sandbox Code Playgroud)
为什么我要把'吠声'称为"吠叫" protected?在这种情况下,这些__get()和__set()方法是否有效地使'吠声'公开?
我正在开发一个涉及以高抽象水平生成表单的应用程序(这是CMS应用程序)。我想动态创建CFormModel对象并即时设置表单字段。我想我可以通过扩展CFormModel,然后动态创建代表表单字段的类属性(在Yii语言中为“属性”)来做到这一点。
为了说明,而不是在以下类(在文件中定义)中指定登录表单:
// From: http://www.yiiframework.com/doc/guide/1.1/en/form.model
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
private $_identity;
public function rules()
{
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'), // assume function authenticate defined elsewhere
);
}
}
Run Code Online (Sandbox Code Playgroud)
我要这样做如下:
class MyFormModel extends CFormModel {
protected $_rules = array();
public function __construct($attributes=array(), $rules=array()) {
foreach ($attributes as $i => $attr) {
$this->{$attr} = ???; // <<== This is the key here
}
// pass in array of rules as …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个将数据存储在本地缓冲区中并充当数据库接口的类。我有以下代码:
class Table(object):
def __init__(self, tableName, **columnDict):
self.tableName = tableName
self.columns = {}
self.types = {}
self.columns['id'] = []
self.types['id'] = 'INT PRIMARY KEY NOT NULL'
for name in columnDict:
self.columns[name] = []
self.types[name] = columnDict[name]
def updateBufferRow(self, index, updateDict):
for key in updateDict:
self.columns[key][index] = updateDict[key]
def getBufferRow(self, index):
row = {}
for key in self.columns:
row[key] = self.columns[key][index]
return row
def __getitem__(self, key, **args):
""" Allows using self[key] method """
return self.getBufferRow(key)
def __setitem__(self, key, value, **args):
""" …Run Code Online (Sandbox Code Playgroud) 我有一个框架(OpenCart)Controller类(如:catalog/controller/product/product.php)代码如下:
class ControllerProductProduct extends Controller {
public function index() {
//some code
$this->response->setOutput($this->render());
//some more code
}
}
Run Code Online (Sandbox Code Playgroud)
有一种表达方式$this->response->setOutput($this->render());.我知道这个表达式用于什么,但我对它的工作方式感到困惑.
$this指当前类,即ControllerProductProduct,它意味着$this->response对象必须存在于ControllerProductProduct其父类或其父类中Controller.但这种情况并非如此.这个对象实际上存在于父类的一个受保护的财产Controller作为Controller::registry->data['response']->setOutput().所以不应该这样说:
$this->registry->data['response']->setOutput();
Run Code Online (Sandbox Code Playgroud)
而不是$ this-> response-> setOutput();
我也给了一个Controller课程片段,所以你可以有想法.
abstract class Controller {
protected $registry;
//Other Properties
public function __construct($registry) {
$this->registry = $registry;
}
public function __get($key) {
//get() returns registry->data[$key];
return $this->registry->get($key);
}
public function __set($key, $value) {
$this->registry->set($key, $value);
}
//Other methods
} …Run Code Online (Sandbox Code Playgroud) 我试图在反射类中找到一个魔术方法的检查,但它不存在.也许php(我使用的是php 5.3)还有其他一些工具可以解决这个问题吗?像这样的东西:
class myClass {
public function __call($method, $arguments)
{
return 'is magic';
}
public function notMagic()
{
return 'not a magic';
}
}
$reflection = new ReflectionMethod('myClass', 'magic');
if ($reflection->isMagic())
{
/* do something if is magic*/
}
Run Code Online (Sandbox Code Playgroud) class A(object):
def __getitem__(self, item):
print item
a = A()
a[0:-1]
Run Code Online (Sandbox Code Playgroud)
Windows上的python 2.7.3,2.7.7,2.7.8,3.3.2上的输出:
slice(0, -1, None)
Run Code Online (Sandbox Code Playgroud)
win 32上的python 2.7.6(32位)输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute '__len__'
Run Code Online (Sandbox Code Playgroud)
在python 2.7.6中,切片对象尝试获取实例的长度,以便它可以将"-1"转换为实际值.例如,如果实例的长度为10,则输出将为"slice(0,9,None)".
这种行为似乎很奇怪.任何人都可以验证我的观察是否正确吗?如果是,那么这背后是否有任何官方文件?我们如何应对这种行为以支持我们在所有版本的python上的项目?
magic-methods ×10
php ×6
python ×3
class ×2
c# ×1
datamodel ×1
dynamic ×1
facade ×1
forms ×1
getter ×1
hide ×1
null ×1
opencart ×1
performance ×1
python-2.7 ×1
reference ×1
reflection ×1
setter ×1
yii ×1