我是班级的新手,这是我编写的一小段代码,但我对此概念仍然非常不满意,并且想知道方法{{1}在这里发挥作用,如果它甚至需要?
node_name
我寻求的行为与此相当:
from rdflib import BNode
class HigherNode(object):
def node_name(name):
return name
def __init__(self, **kwargs):
self.node_type = kwargs.get('node_type', 'cog_con')
self.position = kwargs.get('position', 0)
self.node_id = self.node_name
self.node = kwargs.get(self.node_name(), BNode())
for key, value in kwargs.items():
setattr(self, key, value)
def __str__(self):
return 'This is the node of {} in the graph'.format(self.node_id)
用作:
elephant = BNode()
答案 0 :(得分:1)
因此,首先,方法必须由类的实例调用。所以,你的行为看起来像这样:
# create an instance
node = HigherNode()
# get the name
print node.node_name()
但是,你从未在课堂上声明过姓名。所以,你必须做这样的事情:
def node_name(self):
return self.name
(所有实例在调用时都会将引用传递给自己的函数,因此在函数调用中总是必须至少有一个变量。您不必自己调用它。)
真的,看起来你想要的实际上是名字设定者/吸气剂。
在 __ init __ 中声明/设置变量。
def __init__(self, **kwargs):
self.node_name= kwargs.get('node_name', None)
然后你可以使用这样的变量:
# create an instance
node = HigherNode()
# get the name
print node.node_name
# set the name
node.node_name = "bluh"
由于您的类扩展了对象,因此请使用getter / setter属性。
@property
def node_name(self):
return self.node_name
@node_name.setter
def node_name(self, x):
self.node_name = str(x)
这些与选项1中的上述内容完全相同:
# create an instance
node = HigherNode()
# get the name
print node.node_name
# set the name
node.node_name = "bluh"
我更喜欢这种方法,因为它可以让您更好地控制事物的设置方式,甚至是否可以设置或获取它们! (例如,只需创建一个没有相应setter属性的getter属性。)
然而,第二种方法需要设置更多工作,可能不适合简单变量。