我需要在我的程序中提供类似的东西
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
类通常接收的任何参数
答案 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'>