Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写具有类中对象列表的几乎类型安全的代码?_Python_Visual Studio Code_Type Safety - Fatal编程技术网

Python 如何编写具有类中对象列表的几乎类型安全的代码?

Python 如何编写具有类中对象列表的几乎类型安全的代码?,python,visual-studio-code,type-safety,Python,Visual Studio Code,Type Safety,我正在寻找一种方法,在使用对象列表的同时,用Python编写几乎类型安全/可维护的代码。 我发现了以下实施intellisense功能的方法(在vscode中测试): 但是,当在类中使用时,相同的想法不再有效(关于intellisense): 我猜应该有一个简单的解决方法。正如评论中指出的,您需要将v作为一个实例属性: class-MyClass: 定义初始化(自): self.v=[] def添加_元素(自身): a=MyObject() a、 键1=1 self.v.append(a) de

我正在寻找一种方法,在使用对象列表的同时,用Python编写几乎类型安全/可维护的代码。 我发现了以下实施intellisense功能的方法(在vscode中测试):

但是,当在类中使用时,相同的想法不再有效(关于intellisense):


我猜应该有一个简单的解决方法。

正如评论中指出的,您需要将
v
作为一个实例属性:

class-MyClass:
定义初始化(自):
self.v=[]
def添加_元素(自身):
a=MyObject()
a、 键1=1
self.v.append(a)
def use_元件(自身):
#这不显示(智能感知)
打印(self.v[0].key1)
但是您提到了类型安全,这意味着您还应该添加类型注释,并在代码上运行mypy,以确保所有代码都正确地使用了预期的类型

输入导入列表中的

类别MyClass:
定义初始化(自)->无:
self.v:List[MyObject]=[]
def添加元素(自身)->无:
a=MyObject()
a、 键1=1
self.v.append(a)
def use_元素(自身)->无:
#这不显示(智能感知)
打印(self.v[0].key1)

您已将
v
定义为类级变量,并与该类的所有实例共享。您是对的。这就是为什么它实际上不起作用的原因!我这样做是为了可以像下面这样使用变量
MyClass.v
是的,我在更宽松的术语中寻找类型安全性(只是类属性定义),但这是一个有用的补充
class MyObject(object):
    key1 = None
    key2 = None

a = MyObject()

v = []


def add_element():
    a = MyObject()
    a.key1 = 1
    v.append(a)

add_element()

# this works (intellisense)
print(v[0].key1)
class MyClass():
    v = []

    def add_element(self):
        a = MyObject()
        a.key1 = 1
        self.v.append(a)

    def use_element(self):
        # this does not show (intellisense)
        print(self.v[0].key1)


c = MyClass()

c.add_element()
c.use_element()