如何在Python中创建“子变量”? 基本上我想做的是有一个包含变量的类,它返回像列表这样的值,但如果我这样做
var.subvar
它只会返回列表中的值之一。
示例:
class Object:
def _init_(self, x, y, z):
self.position.x = x #Sets sub-variables
self.position.y = y
self.position.z = z
#Functions
object = Object(5, 3, 1)
print(object.position) #Should print out 5, 3, 1
print(object.position.y) #Should print out 3
我知道我可以使用函数或字典,但是有没有其他方法而不使用任何括号?
我尝试将变量名称设置为
var.subvar
,但效果并不好,我正在寻找更有效的东西(如果存在类似的东西)。
你可以创建一个像 Vector3 这样的类,它存储 3 个变量 x、y 和 z。然后,您只需将 Vector3 存储在另一个类中即可。 否则你也可以使用 @property 上面的方法返回一些变量,这个装饰器使方法看起来像一个变量,所以你可以像不带括号的类的变量一样调用它
您可以创建一个类
Point
来执行如下操作:
class Point3D:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
self.coord = [x, y, z]
class Object:
def __init__(self, x, y, z):
self.position = Point3D(x, y, z)
# Functions
object = Object(5, 3, 1)
print(object.position.coord) # note self.position.coord, not just self.position (which will print the object)
print(object.position.y) # Should print out 3
首先创建一个具有您想要的行为的 Position 类:
class Position:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
这将允许您访问对象的 x、y 和 z 属性。为了定义如何打印对象,您需要定义其
__repr__
- 返回对象的字符串表示形式的方法。
def __repr__(self):
return ", ".join(str(i) for i in [self.x, self.y, self.z])
您可以测试对象:
position = Position(5, 3, 1)
print(position) # 5, 3, 1
print(position.x) # 5
您可以看到它按照您想要的方式工作
object.position
,所以现在只需将其分配给它即可。
class Object:
def __init__(self, x, y, z):
self.position = Position(x, y, z)
o = Object(5, 3, 1)
(或者,您可以创建一个直接接受位置对象的构造函数:
class Object:
def __init__(self, position):
self.position = position
o = Object(position)
两者最终都会产生相同的行为:
print(o.position) #Should print out 5, 3, 1
print(o.position.y) #Should print out 3
正如有人在评论中建议的那样,您可以创建另一个名为 Position 的类。我添加了
__str__
,因此当您调用 object.position
时,将打印值而不是类对象。请记住,您需要双下划线来表示 __init__
等
class Object:
def __init__(self, x, y, z):
self.position = Position(x, y, z)
#Functions
class Position:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __str__(self):
return f"{self.x}, {self.y}, {self.z}"
object = Object(5, 3, 1)
print(object.position) #Should print out 5, 3, 1
print(object.position.y) #Should print out 3