4 回答
TA贡献1797条经验 获得超6个赞
您发布的代码中有缩进错误,您应该首先缩进方法及其内容,这意味着方法在类中。另一方面,self引用实例,它调用特定的方法并提供对所有实例数据的访问。例如
student1 = Student('name1', 20)
student2 = Student('name2', 21)
student1.some_method(arg1)
在最后一次调用中,在后台student1传递了方法的 self 参数,这意味着所有 student1 的数据都可以通过self参数获得。
您正在尝试使用,它没有实例的数据,旨在在没有显式实例的情况下对类相关函数进行逻辑分组,这在方法定义staticmethod中不需要:self
class Student:
...
@staticmethod
def get_biggest_number(*ages):
# do the task here
另一方面,如果您想跟踪所有学生实例并应用 get_biggest_number 方法自动处理它们,您只需定义类变量(而不是实例变量)并在每个实例上将__init__新实例附加到该列表:
class Student:
instances = list() # class variable
def __init__(self, name, age):
# do the task
Student.instances.append(self) # in this case self is the newly created instance
在get_biggest_number方法中,您只需遍历Student.instances包含 Student 实例的列表,您就可以访问instance.age实例变量:
@staticmethod
def get_biggest_number():
for student_instance in Student.instances:
student_instance.age # will give you age of the instance
希望这可以帮助。
TA贡献1776条经验 获得超12个赞
您不应该将 classmethod 与实例方法混淆。在python中,您可以将类中的方法声明为classmethod。此方法将类的引用作为第一个参数。
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
def get_biggest_number(self, *age):
result=0
for item in age:
if item > result:
result= item
return result
@classmethod
def get_classname(cls):
# Has only access to class bound items
# gets the class as argument to access the class
return cls.__name__
@staticmethod
def print_foo():
# has not a reference to class or instance
print('foo')
TA贡献2041条经验 获得超4个赞
self
在 python 中是指创建的类的实例。类似于this
C# 和 Java 中的东西。但是有一些区别,但简而言之:当您不用self
作方法的输入时,实际上您是在说此方法不需要任何实例,这意味着此方法是一个static method
并且永远不会使用任何类属性。
在您的示例中,我们get_biggest_number
甚至可以调用没有一个实例的方法,例如,您可以像这样调用此方法:
Student.get_biggest_number(20,30,43,32)
输出将是43
.
TA贡献1909条经验 获得超7个赞
self 关键字用于表示给定类的实例(对象)。...但是,由于类只是一个蓝图,因此 self 允许访问 python 中每个对象的属性和方法。
class ClassA:
def methodA(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
假设 ObjectA 是该类的一个实例。
现在,当调用 ObjectA.methodA(arg1, arg2) 时,python 在内部将其转换为:
ClassA.methodA(ObjectA, arg1, arg2)
self 变量引用对象本身,代码变为:
class ClassA:
def methodA(ObjectA, arg1, arg2):
ObjectA.arg1 = arg1
ObjectA.arg2 = arg2
添加回答
举报