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

2024-04-16 15:11:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在学习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
    

Tags: 代码nameself参数return属性initdef
3条回答
def __init__(self, radius=1):
    self.radius = radius 

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

^{pr2}$

self.name = 'Methods'行中,您正在创建一个初始化为字符串值Methods的变量{}。在

Why was is not written like this: def init(self, name) and def getName(self, name)?

为类作用域定义了self.name。您可以在类的任何地方获取和设置它的值。在

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

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

我真诚地建议你遵循Python tutorial,它将解释所有这些和更多。在

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

    def my_func(param=1): ... print(param) ... my_func() #uses the default value 1 my_func(2) #uses the value passed 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有很多这样的“特殊方法”,例如在使用操作符+时调用方法__add__(self, other)。在

相关问题 更多 >