Наследование VPython

В настоящее время я пытаюсь создать класс с единственной целью быстрого создания объекта VPython и добавления дополнительных значений к объекту. VPython автоматически создает объект с такими значениями, как положение и размеры. Однако я также хочу добавить такие переменные, как физические свойства материала и импульс. Итак, вот мое решение:

class Bsphere(physicsobject):

     def build(self):

         sphere(pos=ObjPosition, radius=Rad,color=color.red)

С физическим объектом, выглядящим примерно так:

class physicsobject:

    def __init__(self):

         self.momentum=Momentum

По сути, я хочу, чтобы это по-прежнему сохраняло исходные свойства объекта VPythonsphere() при добавлении новых переменных. Это на самом деле работает изначально, объект визуализируется и добавляются переменные. Но теперь у меня нет возможности изменить объект VPython. Если я наберу:

Sphereobj.pos=(1,2,3)

Позиция будет обновляться как переменная, однако VPython не будет обновлять отображаемый объект. Теперь существует разрыв между объектом и визуализируемым объектом. Есть ли способ унаследовать аспекты рендеринга объекта VPython при создании нового объекта? я не могу просто использовать

class Bsphere(sphere(pos=ObjPosition, radius=Rad,color=color.red)):

     self.momentum=Momentum

и документации по VPython не так много.


person user1453064    schedule 11.04.2013    source источник


Ответы (4)


Я не использую VPython. Однако, судя по всему, вы наследуете свойство physicsobject, а не sphere. Моя рекомендация попробовать это:

# Inherit from sphere instead
class Bsphere(sphere):
     # If you want to inherit init, don't overwrite init here
     # Hence, you can create by using
     # Bpshere(pos=ObjPosition, radius=Rad,color=color.red)
     def build(self, material, momentum):
         self.momentum = momentum
         self.material = material

Затем вы можете использовать:

 myobj = Bsphere(pos=(0,0,0), radius=Rad,color=color.red)
 myobj.pos(1,2,3)

Тем не менее, я рекомендую overwrite метод __init__ в вашем дочернем классе, при условии, что вы знаете все аргументы для объявления в исходной конструкции sphere.

person nqngo    schedule 11.04.2013
comment
Я бы порекомендовал вам ознакомиться с учебным пособием learnpythonthehardway по наследованию, в частности переопределению. Концепции очень важны для понимания и помогут вам избежать ошибок в дальнейшем. - person nqngo; 12.04.2013

from visual import *
class Physikobject(sphere):
    def __init__(self):
        sphere.__init__(self, pos = (0,0,0), color=(1,1,1))
        self.otherProperties = 0

Я думаю, что это помогает - вопрос может быть старым, потому что люди все еще могут думать об этом.

person m00lti    schedule 07.05.2015

Я большой пользователь vpython и никогда не использовал подобные вещи, но я знаю, что vpython уже имеет функцию, которую вы пытаетесь реализовать.
================= ==============Пример================================== знак равно

 from visual import *
 myball = sphere()
 myball.weight = 50
 print (myball.weight)

Этот код создает мяч, затем инициализирует переменную с именем weight и отображает ее.

person ForLoveOfCats    schedule 13.09.2015

Прелесть VPython в том, что вам не нужно этого делать.

VPython сделает это за вас!

Это все, что вам нужно сделать:

variable_name = sphere()#you can add pos and radius and other things to this if you want
variable_name.momentum = something

Вы можете легко вставить это в функцию:

objectstuffs = []
def create_object(pos,radius,color,momentum):
    global objectstuffs
    objectstuffs.append(sphere(pos=pos,radius=radius,color=color))
    objectstuffs[len(objectstuffs)-1].momentum = momentum

Эта функция определенно не лучшая вещь для использования в каждом случае, но вы можете легко отредактировать функцию, это было просто для примера.

Получайте удовольствие от VPython!

person Douglas - 15 year old Pythoner    schedule 06.01.2016