Как переписать следующий код с PHP на Python, сохранив автозагрузку классов?
Файл Bar1.php:<?php
class Bar1 {
public function baz() {
echo __CLASS__, PHP_EOL;
}
}
Файл Foo.php:<?php
/**
* Class Foo
* @property Bar1 bar1
* @property Bar2 bar2
* ...
* @property Bar10 bar10
*/
class Foo {
public function &__get($property)
{
if (preg_match('/^bar([0-9]+)$/', $property)) {
$className = ucfirst($property);
if (!class_exists($className)) {
throw new Exception('Invalid property');
}
$params = array('some', 'params');
$this->$property = new $className($params);
} else {
throw new Exception('Invalid property');
}
return $this->$property;
}
}
Файл test.php:<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$foo = new Foo();
$foo->bar1->baz();
//Bar1
UPD: Вот, что получилось:Файл bar1.py:class Bar1:
def __init__(self, params):
self.params = params
def baz(self):
print self.params
Файл foo.py:import re
from get_class import get_class
class Foo:
def __getattr__(self, attr):
if re.match('^bar([0-9]+)$', attr):
class_name = attr[0].upper() + attr[1:]
obj = get_class(attr + '.' + class_name)
params = ['some', 'params']
self.attr = obj(params)
else:
raise Exception('Invalid attr')
return self.attr
Файл get_class.py:def get_class(cls):
parts = cls.split('.')
module = ".".join(parts[:-1])
m = __import__(module)
for comp in parts[1:]:
m = getattr(m, comp)
return m
Файл get_class.py:from foo import Foo
foo = Foo()
foo.bar1.baz()
Вот бы еще кто подсказал аналог phpDoc комментария "@property Bar1 bar1" для автокомплита в PyCharm.