繁体   English   中英

Python:与OOP中的类,属性和方法混淆

[英]Python: confused with classes, attributes and methods in OOP

我现在正在学习Python OOP,并且与下面代码中的某些内容相混淆。

问题:

  1. def __init__(self, radius=1):参数/属性“radius = 1”究竟是什么意思? 为什么它不被称为“半径”?

  2. 方法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) 

也,

  1. 在下面的代码中,为什么括号中缺少属性/参数name

  2. 为什么不是这样写的: def __init__(self, name)def getName(self, name)

     class Methods: def __init__(self): self.name = 'Methods' def getName(self): return self.name 

def method(self, argument=value):语法定义一个带有默认值的关键字参数 现在使用该参数是可选的,如果不指定它,则使用默认值。 在您的示例中,这意味着radius设置为1

在方法中,使用self参数引用实例。 nameradius值作为属性存储 selfself.name = 'Methods'self.radius = radius ),稍后可以通过引用该命名属性来检索( return self.namereturn self.radius * self.radius * Circle.pi )。

我衷心建议您按照Python教程 ,它将解释所有这些以及更多。

def __init__(self, radius=1):
    self.radius = radius 

这是默认值设置,用于初始化类范围的变量。这是为了避免任何垃圾输出,以防某些用户在c = Circle()之后调用c.Area() c = Circle()

In the code below, why is the attribute/argument "name" missing in the brackets? 

self.name = 'Methods'您将创建一个初始化为字符串值Methods的变量name

为什么不是这样写的:def init(self,name)和def getName(self,name)?

self.name是为类范围定义的。 您可以在类中的任何位置获取并设置其值。

  1. 语法radius = 1指定参数“radius”,其默认值为1

    def my_func(param = 1):... print(param)... my_func()#uses默认值1 my_func(2)#uses传递的值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)
  1. Python使用“显式”实例传递,因此第一个self参数用于传递调用方法的实例。 您可以将self视为Java的this 但是您必须始终使用它来访问实例属性/方法。 你不能只调用area() ,你必须说self.area()

当您执行self.attribute = 1您将创建一个值为1的新属性attribute ,并将其分配给实例self 因此在area()方法中, self.radius引用self实例的radius属性。

__init__方法是一种特殊方法。 它类似于构造函数。 在实例化类时调用它。 Python有很多这些“特殊方法”,例如在使用operator +时调用方法__add__(self, other)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM