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

时间:2012-09-15 09:36:19

标签: python oop methods

我现在正在学习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)
    
  3. 另外,

    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
      

3 个答案:

答案 0 :(得分:8)

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 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)

  1. 语法radius = 1指定参数" radius"其默认值为1

      
        
          

    def my_func(param = 1):       ...打印(参数)       ...       my_func()#使用默认值       1       my_func(2)#使用传递的值       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)
    
    1. Python使用" explicit"实例传递,因此第一个self参数用于传递调用方法的实例。您可以将self视为Java的this。但是您必须始终使用它来访问实例属性/方法。您不能只调用area(),必须说self.area()
    2. 执行self.attribute = 1后,您需要创建值为attribute的新属性1,并将其分配给实例self。因此,area()方法self.radius引用radius实例的self属性。

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