【学习笔记】Python类中self与__init__()方法

一、self

1、含义

类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值, Python 会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是 self。

--- 摘自《A Byte of Python3(中文版)》

   在类方法中,按惯例第一个第一个参数通常都称为self,这个参数给方法提供一个钩子,从而返回调用的主体,也就是实例对象:因为类可以产生许多实例对象,所以需要这个参数来管理每个实例彼此不同的的数据。  

--- 摘自《Python学习手册第3版》

通过上面2段描述可以把self简单理解为实例本身,一般对类进行实例化得到一个实例对象后,通过点记法来调用类中的方法,如下

Object.method(arg1, arg2) 

等价于

Class.method(Object, arg1, arg2) 

   self就是指Object

2、例子

def sub(a,b):
    print("this outside sub")
    return a-b

class MyOperation:
    
    def sub(self,a,b):
        print("this inner sub")
        return a-b
    
    def mix(self,a,b):
        print(self.sub(a,b))
        print(sub(a,b))

r=MyOperation()  #得到一个MyOperation类的实例
t=r.mix(5,8)     #调用类里面的方法,此处等价于MyOperation.mix(r,5,8)

 

Notes:

(1) 为了达到能够通过实例来调用类中方法的目的,每个方法都必须有一个self参数(这也是类方法和普通函数的区别)

(2)在mix()方法中通过self调用的是类里面定义的sub(),否则是调用的类外面的函数sub()。

 

二、__init__()方法

1. 不用init()方法定义类

定义一个三角形的类,目的是求周长和面积。

import math
class Triangle():
    def getPeri(self,a,b,c):
        return a+b+c
    def getArea(self,a,b,c):
        p=(a+b+c)/2
        return math.sqrt(p*(p-a)*(p-b)*(p-c))
 
tri = Triangle()
print(tri.getPeri(3,4,5))
print(tri.getArea(3,4,5))
print(tri.__dict__)
# 输出结果:12 6.0 {}

从上例中可以看到,在类中并没有定义init()方法,但是也能够得到类似的要求,结果返回了三角形实例tri的周长及面积。 但是,我们通过print(tri.dict)来看这个实例的属性,竟然是空的,我们定义了一个三角形,按理来说它的属性应该是它的三边。但是它竟然没有。这就是没有定义init()的原因了。并且,在实例化对象的时候,tri = Triangle()参数为空,没有指定a、b、c的值,只有在调用函数的时候才指定了。且类中定义的每个方法的参数都有a、b、c,这显然浪费感情,在类中直接指定方法就可以了。

因此,需要在类中定义init()方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义。
 

2、用init()方法定义类 

上述同样的例子,采用init()方法定义类,如下:

import math
class Triangle():
    def __init__(self,a,b,c):
        self.a=a
        self.b=b
        self.c=c
    def getPeri(self):
        return self.a+self.b+self.c
    def getArea(self):
        p=(self.a+self.b+self.c)/2
        return math.sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
 
tri = Triangle(3,4,5)
print(tri.getPeri())
print(tri.getArea())
print(tri.__dict__)
# 输出结果:12 6.0 {'a': 3, 'b': 4, 'c': 5}

 定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。

 

参考文章:

1. https://www.cnblogs.com/hanmk/p/9007689.html

2. https://fishc.com.cn/thread-115047-1-1.html

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值