请参考其方法之外的类?

时间:2016-04-12 16:16:30

标签: python class methods

我需要在我的程序中提供类似的东西

class the_class_name(Parent):
    the_attribute = self.parent_class_method()
    #the parent class method will return a value
    #but I cannot use self here since there's no self

我怎么能把它拿出来?还有其他替代方案可以帮我完成工作吗?

我尝试过这样使用__init__

def __init__(self):
    Parent.__init__(self)
    self.attribute = self.the_method()

但是我在创建对象时遇到问题,它将不会收到Parent类通常接收的任何参数

4 个答案:

答案 0 :(得分:1)

听起来像是在寻找class TheClassName(Parent): def __init__(self): # Set attribute to the result of the parent method self.attribute = super(TheClassName, self).the_method()

__init__

修改

如果您的父类在其自身的class Parent(object): def __init__(self, foo, bar): ... @classmethod def the_method(cls): ... class TheClassName(Parent): def __init__(self, foo, bar): super(TheClassName, self).__init__(foo, bar) self.attribute = super(TheClassName, self).the_method() 函数中包含参数,请将它们包含在子类中:

function alignAround(elements, columns, gutter, weight) {

  var width = ((2 / 3) * 100) - (gutter / 2)
  var push = 100 - width

  var gutterCount = columns - 1
  var repeatAt = (columns * 2) - 1

  var firstShort = 1
  var lastShort = gutterCount
  var lastLong = repeatAt

  if (weight === 'odd') {
    firstShort = columns + 1
    lastShort = repeatAt
    lastLong = columns
  }

  if (columns > 1) {
    width = ((100 - (gutter * gutterCount)) / columns / 100) * 100
    push = (width + gutter) / 2
  }

  return Array.prototype.forEach.call(elements, function(element, index) {

    var styles = {
      width: width,
      height: width
    }

    if (columns > 1) {
      var i = index + 1

      styles.marginRight = gutter

      if ((i - firstShort) % repeatAt === 0) {
        styles.marginLeft = push
      }

      if ((i - lastShort) % repeatAt === 0) {
        styles.marginRight = push
      }

      if ((i - lastLong) % repeatAt === 0) {
        styles.marginRight = 0
      }
    } else if (columns === 1) {

      if (index & 1) {
        styles[weight === 'odd' ? 'margin-left' : 'margin-right'] = push
      } else {
        styles[weight === 'odd' ? 'margin-right' : 'margin-left'] = push
      }

    }

    for (var key in styles) {
      element.style[key] = styles[key] + '%'
    }
  })
}

alignAround(document.querySelectorAll('.block'), 4, 2)

我不太明白为什么你不需要在你需要的时候调用你孩子对象的父方法。

答案 1 :(得分:0)

使用

super(ClassName, self).methodname(arg)

在方法

def child_method(self, arg):
 super(ClassName, self).methodname(arg)

您不能在方法之外使用self

答案 2 :(得分:0)

在创建子类的那一点上没有self,也没有Parent类的实例。这意味着您可以调用的唯一Parent类方法必须是静态方法或类方法。

演示:

class Parent(object):
    @staticmethod
    def static_method():
        return 42

    @classmethod
    def class_method(cls):
        return 43

class TheClassName(Parent):
    the_attribute = Parent.static_method()
    another_attribute = Parent.class_method()

print(TheClassName.the_attribute)  # -> 42
print(TheClassName.another_attribute)  # -> 43

答案 3 :(得分:0)

您必须使用使用@classmethod装饰器或@staticmethod声明的类方法。 @classmethod装饰器是首选,以便正确处理继承,即在派生类上调用该方法(如果你还在学习这个,那就是技术性的一点)。

class Alpha(object):
    @classmethod
    def method1(cls):
        return 'method1 has been called on {}'.format(cls)


class Beta(Alpha):
    def __init__(self):
        self.myattr = Beta.method1()


print(Beta().myattr)

method1 has been called on class <'__main__.Beta'>