В boost.python;Как открыть класс, который содержится в другом классе (с помощью композиции)? - PullRequest
2 голосов
/ 26 апреля 2011

Я хотел бы сделать что-то действительно простое с boost :: python. Я могу найти документацию для функций-членов класса и документацию для унаследованных классов (bleurch), но нигде не могу найти синтаксис для представления иерархий классов, созданных с помощью композиции.

Итак, у меня есть код C ++, который выглядит примерно так:

struct A{
    double x,y;
};

struct B{
    A foo;
    double z;
};

И я хочу выставить оба класса так, чтобы в python я мог написать что-то вроде:

spam = A()
spam.x=1
spam.y=2

eggs = B()
eggs.foo=spam
eggs.z = 33
Print eggs.foo.y

Конечно, это возможно? Но я не могу понять это.

Большое спасибо!

РЕДАКТИРОВАТЬ:

Ложная тревога ... это делается автоматически; если вы используете следующий код экспорта для экспорта каждого из них по отдельности:

class_<A>("A")
   .def_readwrite("x",&A::x)
   .def_readwrite("y",&A::y)
;

class_<B>("B")
  .def_readwrite("z",&B::z)
  .def_readwrite("foo",&B::foo)
;

Меня поразило то, что вам нужно создать экземпляр класса под python до того, как полный список подметодов станет видимым с помощью dir (), т. Е. Следующие результаты дают другие результаты, и вы должны использовать второй тип, чтобы получить полный список членов:

dir(B.foo)
dir(B().foo) 

Очевидно, здесь происходят некоторые технические особенности Python, которые я пока не понимаю ... любые дальнейшие разъяснения приветствуются.

1 Ответ

0 голосов
/ 27 апреля 2011

Документация для dir гласит:

Если объект является объектом типа или класса, список содержит имена его атрибутов и рекурсивные атрибуты его баз.

В вашем примере ваш член класса экспортируется как атрибуты экземпляра, а не атрибуты класса, что вам нужно при экспорте нестатического члена класса.Вот почему вам нужно создать экземпляр класса в python, чтобы dir возвращал атрибуты, потому что атрибуты не существуют до тех пор, пока не будет вызван метод init .

При объявлении атрибутов класса онибудет отображаться при вызове dir для типа, потому что атрибуты класса сразу после определения класса:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
...     name = "blah"
...     def __init__(self):
...         self.second_name = "blah2"
...
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__', 'name']
>>> f = Foo()
>>> f
>>> dir(f)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__', 'name', 'second_name']
...