【问题标题】:Using a function within a class in python (to use self or not)在 python 的类中使用函数(是否使用 self)
【发布时间】:2017-04-14 14:44:04
【问题描述】:
class Neuralnetwork(object):

     def __init__(self, data):    
         self.data = data

     def scan(self):
         print(self.data)

     def sigmoid(self, z):
         g = 1 / (1 + math.exp(-z))
         return (g)

     a1 = sigmoid(7)
     print a1

我不确定为什么它不会使用 sigmoid 函数打印 a1 变量。它不断启动一个错误,说它需要 2 个输入而不是 1 个。但我认为通过在类中调用该函数,我不需要再次向它提供 self 吗?

编辑:我有最后两个语句,因为我仍在测试,以确保一切都在做它应该在课堂上做的事情。

【问题讨论】:

  • 因为sigmoid 是类定义中的一个函数。你为什么要缩进 a1 = ..print a1 成为班级的一员?如果 def sigmoid 不是一个方法,为什么不把 def sigmoid 放在之外?
  • 你确定你最后两行的缩进吗?看来应该下课了。
  • 如果你是从一个类方法的内部调用它,你需要将它调用为self.sigmoid(7)。如果你想从外部调用它,那么你需要创建一个Neuralnetworkinstance来调用obj.sigmoid(7)
  • 你是对的,如果你从课堂上打电话,你就不需要自我。但是,这个调用应该从另一个方法发生。您不能像这里那样在类中进行浮动调用。
  • 看看下面的两个答案,他们应该可以帮助你

标签: python function class self


【解决方案1】:

我注意到你的 sigmoid 方法根本不使用 self,也就是说,它不依赖于实例。您可以将其作为普通函数放在类之外。但如果它与类密切相关,您可能更愿意将其封装为静态方法,从 sigmoid def 中完全删除 self:

#/usr/bin/env python3

import math

class NeuralNetwork(object):

    def __init__(self, data):    
        self.data = data

    def scan(self):
        print(self.data)

    @staticmethod
    def sigmoid(z):
        g = 1 / (1 + math.exp(-z))
        return (g)

a1 = NeuralNetwork('abc')
print(a1.sigmoid(7))

【讨论】:

    【解决方案2】:

    sigmoidNeuralnetwork类的一个方法,所以你需要先创建一个Neuralnetwork类的实例,然后才能使用sigmoid函数,如果你在类之后调用它定义:

    class Neuralnetwork(object):
         def __init__(self, data):    
             self.data = data
    
         def scan(self):
             print(self.data)
    
         def sigmoid(self, z):
             g = 1 / (1 + math.exp(-z))
             return (g)
    
    # replace data and z with appropriate values
    nn = Neuralnetwork(data)
    a1 = nn.sigmoid(z)
    print a1
    

    如果您需要在类中使用它,请将块放在方法中:

    class Neuralnetwork(object):
         def __init__(self, data):    
             self.data = data
    
         def scan(self):
             print(self.data)
    
         def sigmoid(self, z):
             g = 1 / (1 + math.exp(-z))
             return (g)
    
         def print_sigmoid(self, z):
             a1 = self.sigmoid(z)
             print a1
    
    # replace data and z with appropriate values
    nn = Neuralnetwork(data)
    nn.print_sigmoid(z)
    

    我还建议根据 PEP 8 样式指南将类名称更改为 NeuralNetworkhttps://www.python.org/dev/peps/pep-0008/#class-names

    【讨论】:

    • 谢谢!这很有意义。
    • 不客气! @a1letterword 如果答案能解决您的问题,请接受/投票。
    【解决方案3】:

    在你的类之外的最后两行(没有缩进)你可以修改它们:

    a1 = Neuralnetwork(data).sigmoid(7)
    print(a1)
    

    但你必须向你的班级提供数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      相关资源
      最近更新 更多