在类

时间:2016-06-09 19:00:28

标签: python

我是班级的新手,这是我编写的一小段代码,但我对此概念仍然非常不满意,并且想知道方法{{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()

1 个答案:

答案 0 :(得分:1)

因此,首先,方法必须由类的实例调用。所以,你的行为看起来像这样:

# create an instance
node = HigherNode()

# get the name
print node.node_name()

但是,你从未在课堂上声明过姓名。所以,你必须做这样的事情:

def node_name(self):
    return self.name

(所有实例在调用时都会将引用传递给自己的函数,因此在函数调用中总是必须至少有一个变量。您不必自己调用它。)

真的,看起来你想要的实际上是名字设定者/吸气剂。

试试这个:

  1. __ 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"
    
  2. 由于您的类扩展了对象,因此请使用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属性。)

    然而,第二种方法需要设置更多工作,可能不适合简单变量。