我开始用python创建类,我对术语非常困惑,所以我找不到问题的答案,因为我不知道如何问这些问题,因此这篇文章的标题是双重的。我将尝试用以下代码澄清我不知道如何提问的问题:
我想在一个简单的类中创建一个方法:
class SimpleClass:
add(self,Value)
#Magic goes here
SC=SimpleClass()
该方法应等同于向类中添加新变量:
SC.NewVariableInsideTheClass="test"
但通过一种方法,例如:
SC.NewVariableInsideTheClass.add("test")
在这两种情况下,“NewVariableInsideTheClass”以前都不存在,我是第一次在类中创建这个变量。你知道吗
所以该方法应该首先创建不存在的实例(我认为这是类中变量的名称),然后将其值设置为“test”,但我真的找不到/搜索如何做到这一点。。。你知道吗
哪个问题才是我需要的??你知道吗
非常感谢!你知道吗
---------------编辑-----------------
好吧,我想做的是得到相同的结果:
SC.NewVariableInsideTheClass.add("test")
当你这样做的时候:
SC.NewVariableInsideTheClass.add("test")
但是这两个都必须在类外完成,“NewVariableInsideTheClass”是第一次使用!这里的目标是使用类作为变量存储,比如当一个变量第一次被使用时,会发生一些事情,如果它已经存在(以SC.NewVariableInsideTheClass类)我可以用不同的方法。 希望这是更具体的现在。。。你知道吗
第二次编辑;原因--------------------
哇我对你的回答的质量和细节印象深刻,我非常感谢!我想让您知道为什么我要这样做:我正在创建一个简单的python脚本IDE(现在主要是为了学习python,还不太有用)。因此,代码的基本原理是,它会沿途创建新的变量。由于程序也将创建函数,因此我创建和处理变量的第一个解决方案是将所创建程序中的所有变量都设置为全局变量,并在每个新函数中再次调用它们。好吧,代码很难看,所以我决定学习和使用一个类,但由于每个程序中的变量不同,我想标准化函数创建(即不需要知道它是否是第一个函数,是否需要初始化任何变量,或者它们是否已经存在),能够: -将一个新变量存储在一个名为变量的列表中,即使它不存在,也要使用一个我可以轻松访问的名称 -能够用新值扩展先前的变量作为列表中的新项 -能够检索这些值 在没有使用globals的情况下,我发现了这个解决方案。实际上我修改了你的代码,现在我在使用你的代码,但是我没有命名为“add”,而是命名为“append”,所以我可以自由地做:
在SC.NewVar.append附加('这是新值') SC.NewVar.append附加('这是新值')
第一次,它将被创建(因为它不存在),但是第二次新值被追加,因此,我将能够调用它/使用它,或者从自动生成的代码中的任何其他函数使用它:)
免责声明:我不知道您为什么要这样做。如果要使用
setattr
动态创建属性,应该足够了:总之,有一种简单的方法可以使用helper类获得所需的内容:
关于你的评论。如果您询问是否可以这样写
SimpleClass
:返回字符串
'test'
和,在调用Sc.new_attr.add('test')
调用之后:是这样的:
现在返回字符串
'other'
,然后答案是:不,这是不可能的。你知道吗不可能编写一个类,使得下面的不会产生一个
AttributeError
:你为什么问?好吧,让我们看看解释器实际上做了什么:
dis
模块允许我们查看解释器正在执行的字节码。 注意有两个不同的字节码。 如您所见,解释器首先获取new_attr
属性,然后作为一个完全独立的操作,它检索add
属性。你知道吗现在,类
SC
只能修改第一个属性访问的行为(即对new_attr
的访问)。它无法知道下一个字节码将访问add
,因此唯一明智的做法是返回设置的字符串。你知道吗以下属性访问
add
是对检索到的值执行的。这意味着解释器将查找字符串的add
属性,该属性显然不存在。你知道吗避免这种
AttributeError
的唯一方法是返回具有add
方法的对象,但这意味着:将失败,因为不是返回字符串
"test"
,而是返回另一个对象。你知道吗解决这个问题的方法是返回一个具有
add
方法和value
属性的对象,这样我们可以得到如下结果:另一种解决方案是编写此类,使其行为类似于字符串(我们甚至可以将
str
作为子类,但不要这样做!子类化内置的从来都不是正确的做法,如果你在不知道确切后果的情况下这样做,你会遇到问题,很难发现和解决),但这意味着代码会变得更加复杂,必须实现所有字符串支持的操作(这意味着实现大约80-90-100个方法!)你知道吗让我们用add方法声明一个类ABC
现在add是instance方法,这样就完成了您要做的事情,即在instance方法中声明一个实例变量。你知道吗
相关问题 更多 >
编程相关推荐