2013-04-11 2 views
3

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

class Bsphere(physicsobject): 

    def build(self): 

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

С physicsobject ищет что-то вроде этого:

class physicsobject: 

    def __init__(self): 

     self.momentum=Momentum 

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

Sphereobj.pos=(1,2,3) 

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

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

    self.momentum=Momentum 

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

ответ

1

Я не использую 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 конструкции ,

+0

Спасибо, похоже, сейчас работает. – user1453064

+1

Я бы порекомендовал вам пройти учебник из [learnpythonthehardway] (http://learnpythonthehardway.org/book/ex44.html) о наследовании, в частности переопределяя. Концепции очень важны для понимания и помогут вам избежать ошибок позже. – nqngo

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

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

0

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

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

Этот код создает шар затем инициализирует переменную вес затем отображает его.

0

Замечательная вещь о 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!