我现在正在学习Python OOP,并且与下面代码中的某些内容相混淆。
问题:
def __init__(self, radius=1):
参数/属性“radius = 1”究竟是什么意思?
为什么不称它为“半径”?
方法area()没有参数/属性“radius”。 它在代码中从哪里获得“半径”? 怎么知道半径是5?
class Circle:
pi = 3.141592
def __init__(self, radius=1):
self.radius = radius
def area(self):
return self.radius * self.radius * Circle.pi
def setRadius(self, radius):
self.radius = radius
def getRadius(self):
return self.radius
c = Circle()
c.setRadius(5)
另外,
在下面的代码中,为什么括号中缺少属性/参数name
?
为什么不是这样写的:def __init__(self, name)
和def getName(self, name)
?
class Methods:
def __init__(self):
self.name = 'Methods'
def getName(self):
return self.name
答案 0 :(得分:8)
def method(self, argument=value):
语法使用默认值定义关键字参数。现在使用该参数是可选的,如果不指定它,则使用默认值。在您的示例中,这意味着radius
设置为1
。
在方法中,使用self
参数引用实例。 name
和radius
值作为属性(self
和self.name = 'Methods'
)存储在 self.radius = radius
上,稍后可通过引用检索到该命名属性(return self.name
,return self.radius * self.radius * Circle.pi
)。
我衷心建议您按照Python tutorial进行操作,它会解释所有这些以及更多内容。
答案 1 :(得分:1)
def __init__(self, radius=1):
self.radius = radius
这是默认值设置,用于初始化类范围的变量。这是为了避免在某些用户在c.Area()
之后立即调用c = Circle()
时出现任何垃圾输出。
In the code below, why is the attribute/argument "name" missing in the brackets?
在第self.name = 'Methods'
行中,您创建的变量name
已初始化为字符串值Methods
。
为什么不是这样写的:def init(self,name)和def getName(self,name)?
self.name
是为类范围定义的。您可以在课堂内的任何地方获取并设置其值。
答案 2 :(得分:0)
语法radius = 1
指定参数" radius"其默认值为1
:
def my_func(param = 1): ...打印(参数) ... my_func()#使用默认值 1 my_func(2)#使用传递的值 2
请注意,在python中存在更多种类的参数:位置和关键字参数,或两者兼而有之。
通常可以使用位置表示法和关键字:
分配参数>>> def my_func(a,b,c):
... print (a,b,c)
...
>>> my_func(1,2,3)
(1, 2, 3)
>>> my_func(1,2,c=3)
(1, 2, 3)
self
参数用于传递调用方法的实例。您可以将self
视为Java的this
。但是您必须始终使用它来访问实例属性/方法。您不能只调用area()
,必须说self.area()
。执行self.attribute = 1
后,您需要创建值为attribute
的新属性1
,并将其分配给实例self
。因此,area()
方法self.radius
引用radius
实例的self
属性。
__init__
方法是一种特殊方法。它类似于构造函数。
在实例化类时调用它。 Python有很多这些"特殊方法",例如在使用运算符__add__(self, other)
时调用方法+
。