赞
赏
使用 Python 编写 类 时,类中的 构造函数、实例函数和 类函数 的第一个 参数 都是 self。
在 Python 中 self 并不是 关键字,因此 self 名称不是必须的,,我们也可以将 self 名称换成 a 或 b 或其它名字都可以,但是约定成俗,一般都是使用 self。
self 只有在类的方法中才会有,独立的 函数 或方法是不必带有 self 的,且 self 参数在调用时不必传入相应的参数。
在 Python 中,调用类方法时,self 指的就是类 实例对象 的本身。
class People:
money = 10000
def func_name(self, params):
pass
p = People()
p.func_name(params)
我们定义了一个 Person 类,Person 类中有一个实例方法 func_name,func_name 的第一个参数就是 self,也可以换成其他名字。
接着,我们创建了一个 Person 类的实例 p,并且使用 p 调用了实例方法 func_name,此时 func_name 中的 self 就是这里的 p。
且,调用 func_name 方法时,第一个 self 参数不需要我们显式的进行传入,我们只需要传入除了 self 之外的参数即可。
类方法中的 self 参数不必显式传入
print("嗨客网(www.haicoder.net)")
class Student:
def __init__(self, name):
self.name = name
def learn(self, course):
print("I am Learn", course)
def eat(self, food):
print("I am eat", food)
stu = Student("William")
stu.learn("Python")
stu.eat("Apple")
程序运行后,控制台输出如下:
我们创建了一个类 Student,接着,为该类添加了三个方法,其中一个构造方法 __init__
,还有两个实例方法,分别为 learn
和 eat
,这三个方法的第一个参数都是 self。
最后,我们创建了一个类 Student 的实例 stu,并分别使用实例 stu 调用实例方法 learn
和 eat
,我们看到,learn
和 eat
的第一个 self 参数不需要我们显示的传入。
learn
和 eat
中的 self 此时指的就是 stu 这个实例。
类方法中的 self 参数名可以任意指定
print("嗨客网(www.haicoder.net)")
class Student:
def __init__(my, name):
my.name = name
def learn(my, course):
print("I am Learn", course)
def eat(my, food):
print("I am eat", food)
stu = Student("William")
stu.learn("Python")
stu.eat("Apple")
程序运行后,控制台输出如下:
我们将 self 的名字全部换成了 my,最终程序的执行结果与上面的一模一样,即 self 的名字可以任意的修改,但不推荐这么做。
self 还可以做函数返回值,进行返回
print("嗨客网(www.haicoder.net)")
class Student:
def incry(self):
if hasattr(self, 'score'):
self.score += 1
else:
self.score = 1
return self
stu = Student()
stu.incry().incry().incry()
print("Score =", stu.score)
stu.incry().incry().incry()
print("Score =", stu.score)
程序运行后,控制台输出如下:
我们定义了一个类 Student,并且在类 Student 里面定义了一个实例函数 incry,incry 函数同时也返回了 self 参数。
最后,我们可以不停的调用 incry 函数,实现给调用对象 stu 的 score 属性不停的增长。
使用 Python 编写类时,类中的构造函数、实例函数和类函数的第一个参数都是 self。
在 Python 中 self 并不是关键字,因此 self 名称不是必须的,,我们也可以将 self 名称换成 a 或 b 或其它名字都可以,但是约定成俗,一般都是使用 self。
self 只有在类的方法中才会有,独立的函数或方法是不必带有 self 的,且 self 参数在调用时不必传入相应的参数。