Methoden in Metaklassen
Verfasst: Samstag 28. Juli 2018, 11:06
Noch eine Anfaengerfrage, es geht um Methoden in einer Metaklasse.
Der Interpreter meckert da (sicher mit Recht), dass da irgendwas nicht stimmt. Es geht eigentlich darum, dass die einige Methoden die in den echten Klassen definiert werden, Ergebnisse liefern sollen, die dann in einer allgemeinen Methode in der Metaklasse verwendet werden.
Bevor ich das Problem allerdings erklaeren kann, muss ich allerdings ein anderes Problem loesen. Der Kode den ich unten poste ist bei mir in der Datei "section.py" gewesen, und ist zu lang, um ihn hier zu posten. Ich hab daher die wichtigen Teile in eine neue Datei "test.py" ausgelagert.
Das erste Problem ist, dass ich den Kode nicht mehr in die Konsole laden kann.
Mit "from test import RectangularSection" bekomme ich einen ImportError: cannot import name 'RectangularSection' from 'test'. Das gleiche passiert, wenn ich den Kode 1:1 kopiere, ohne irgendwelche Aenderungen.
Der Interpreter meckert da (sicher mit Recht), dass da irgendwas nicht stimmt. Es geht eigentlich darum, dass die einige Methoden die in den echten Klassen definiert werden, Ergebnisse liefern sollen, die dann in einer allgemeinen Methode in der Metaklasse verwendet werden.
Bevor ich das Problem allerdings erklaeren kann, muss ich allerdings ein anderes Problem loesen. Der Kode den ich unten poste ist bei mir in der Datei "section.py" gewesen, und ist zu lang, um ihn hier zu posten. Ich hab daher die wichtigen Teile in eine neue Datei "test.py" ausgelagert.
Das erste Problem ist, dass ich den Kode nicht mehr in die Konsole laden kann.
Mit "from test import RectangularSection" bekomme ich einen ImportError: cannot import name 'RectangularSection' from 'test'. Das gleiche passiert, wenn ich den Kode 1:1 kopiere, ohne irgendwelche Aenderungen.
Code: Alles auswählen
import math
from abc import ABCMeta, abstractmethod
class Section(object):
# https://jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
__metaclass__ = ABCMeta
height = 0
@property
def moment_of_inertia(self):
"""I"""
return self.moment_of_inertia_y
@property
def radius_of_gyration(self):
"""i"""
return self.radius_of_gyration_y
@property
def radius_of_gyration_y(self):
"""iy"""
return math.sqrt(self.moment_of_inertia_y / self.area)
@property
def radius_of_gyration_z(self): # public returns double
"""iz"""
return math.sqrt(self.moment_of_inertia_z / self.area)
@property
def second_moment_of_area_y(self):
"""Wy"""
return self.moment_of_inertia_y / self.z
@abstractmethod
def area(self):
"""A"""
pass
@abstractmethod
def moment_of_inertia_y(self):
"""Iy"""
pass
@abstractmethod
def moment_of_inertia_z(self):
"""Iz"""
pass
@abstractmethod
def area_q(self):
"""Aq"""
pass
@abstractmethod
def z(self):
"""max. distance from neutral axis to edge"""
pass
@abstractmethod
def second_moment_of_area_z(self):
"""Wz"""
pass
class RectangularSection(Section):
"""Rectangular-section"""
def __init__(self, width, height):
self.width = width
self.height = height
if self.width * self.height <= 0:
raise Exception('Rectangular section: impossible geometry')
@property
def area(self):
"""A"""
return self.height * self.width
@property
def area_q(self):
"""Aq"""
return 5 / 6 * self.width * self.height # Studienblatt 1.4
@property
def moment_of_inertia_y(self):
"""Iy"""
return self.width * self.height ** 3 / 12
@property
def moment_of_inertia_z(self):
"""Iz"""
return self.height * self.width ** 3 / 12
@property
def second_moment_of_area_z(self):
"""Wz"""
return self.moment_of_inertia_z / self.width * 2
@property
def second_moment_of_area_y_plastic(self):
"""Wpy"""
return self.width * self.height ** 2 / 4
@property
def z(self):
"""max. distance from neutral axis to edge"""
return self.height / 2
@property
def s_y(self):
return self.width * self.height / 2 * self.height / 4