将属性从 parent 传递到 child class
Passing an attribute from a parent to a child class
我正在尝试创建一个名为 Beams
的 child class,它是 Elements
class 的扩展。后者计算元素的长度并将其存储为 Elements
class 的属性。我想以某种方式将 length
传递给 child class。正确的做法是什么?
请注意:我的代码没有直接实例化 Elements
class。相反,它的属性通过继承在 Beam
class 的实例中使用。
class Elements:
def __init__(self,number,start_node,end_node,e_modulus,cs_area):
self.number = number
self.start_node = start_node
self.end_node = end_node
self.e_modulus = e_modulus
d_x = end_node.x_glob - start_node.x_glob
d_y = end_node.y_glob - start_node.y_glob
self.length = mt.sqrt(d_x**2 + d_y**2)
self.alpha = mt.atan2(d_y, d_x)
r1 = mt.cos(self.alpha)
r2 = mt.sin(self.alpha)
self.rot_matrix = np.array([[r1, r2, 0, 0, 0, 0],
[-r2, r1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, r1, r2, 0],
[0, 0, 0, -r2, r1, 0],
[0, 0, 0, 0, 0, 1]])
class Beam(Elements):
def __init__(self,number,start_node,end_node,e_modulus,cs_area,second_mom_of_area):
super().__init__(number,start_node,end_node,e_modulus,cs_area)
self.second_mom_of_area = second_mom_of_area
k1 = (e_modulus*cs_area)/length
k2 = (12*e_modulus*second_mom_of_area)/(length**3)
k3 = (6*e_modulus*second_mom_of_area)/(length**2)
k4 = (4*e_modulus*second_mom_of_area)/(length)
k5 = (2*e_modulus*second_mom_of_area)/(length)
self.loc_stiff_matrix = np.array([[ k1, 0, 0, -k1, 0, 0],
[ 0, k2, k3, 0, -k2, -k3],
[ 0, k3, k4, 0, -k3, k5],
[-k1, 0, 0, k1, 0, 0],
[ 0, -k2, -k3, 0, k2, 0],
[ 0, k3, k5, 0, -k3, k4]])
您在父项 class 中定义的所有内容都由子项继承,除非在子项的主体中明确修改,否则它们可以作为属性直接访问。
你的情况:
beam = Beam(**kwargs)
print(beam.length)
# or
print(getattr(beam, "length"))
应该可以。
我正在尝试创建一个名为 Beams
的 child class,它是 Elements
class 的扩展。后者计算元素的长度并将其存储为 Elements
class 的属性。我想以某种方式将 length
传递给 child class。正确的做法是什么?
请注意:我的代码没有直接实例化 Elements
class。相反,它的属性通过继承在 Beam
class 的实例中使用。
class Elements:
def __init__(self,number,start_node,end_node,e_modulus,cs_area):
self.number = number
self.start_node = start_node
self.end_node = end_node
self.e_modulus = e_modulus
d_x = end_node.x_glob - start_node.x_glob
d_y = end_node.y_glob - start_node.y_glob
self.length = mt.sqrt(d_x**2 + d_y**2)
self.alpha = mt.atan2(d_y, d_x)
r1 = mt.cos(self.alpha)
r2 = mt.sin(self.alpha)
self.rot_matrix = np.array([[r1, r2, 0, 0, 0, 0],
[-r2, r1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, r1, r2, 0],
[0, 0, 0, -r2, r1, 0],
[0, 0, 0, 0, 0, 1]])
class Beam(Elements):
def __init__(self,number,start_node,end_node,e_modulus,cs_area,second_mom_of_area):
super().__init__(number,start_node,end_node,e_modulus,cs_area)
self.second_mom_of_area = second_mom_of_area
k1 = (e_modulus*cs_area)/length
k2 = (12*e_modulus*second_mom_of_area)/(length**3)
k3 = (6*e_modulus*second_mom_of_area)/(length**2)
k4 = (4*e_modulus*second_mom_of_area)/(length)
k5 = (2*e_modulus*second_mom_of_area)/(length)
self.loc_stiff_matrix = np.array([[ k1, 0, 0, -k1, 0, 0],
[ 0, k2, k3, 0, -k2, -k3],
[ 0, k3, k4, 0, -k3, k5],
[-k1, 0, 0, k1, 0, 0],
[ 0, -k2, -k3, 0, k2, 0],
[ 0, k3, k5, 0, -k3, k4]])
您在父项 class 中定义的所有内容都由子项继承,除非在子项的主体中明确修改,否则它们可以作为属性直接访问。
你的情况:
beam = Beam(**kwargs)
print(beam.length)
# or
print(getattr(beam, "length"))
应该可以。