python极简教程:对象的方法_python对象的含义
这一场,主讲python的面向对象的第二部分—— 对象的方法 。
目的:掌握Python对象的五个核心方法。
init和new
讲解之前,先上一段代码
class Demo:
def __init__(self, name):
print("init")
print("init " + name)
def __new__(cls, *args, **kwargs):
print("new")
print("new " + args[0])
d = Demo("张三")
通过前面的学习,你能说出这段代码运行的输出结果吗?
答案是:
#new
#new 张三
通常,我们会认为__init__()是类的初始化方法,当实例化类之后,会优先执行它(运行后应当优先输出"init"、"init 张三"),但实际上,__new__()方法才优先执行的方法,同时,它也是创建对象的方法。
说得通俗一点:以造房子举例,new方法是打地基,存放建材原料,init方法则是按照图纸建造房子。
那么,什么时候用new方法?
其实,用得很少,更多的时候,我们使用的是init方法。但init方法用久了之后,就会误以为它是创建实例的方法,而实际上,new方法才是创建实例的方法。
大家谨记,以免面试时踩坑。
类方法、静态方法、对象方法
首先,先讲讲这三个方法如何使用。
- 类方法:使用 @classmethod 装饰,第一个参数是cls
- 静态方法:使用 @staticmethod 装饰
- 对象方法:不使用装饰器,第一个参数是self
class Cat:
age = 5
area = 'Chengdu'
def __init__(self, name):
self.name = name
# 这是一个有问题的方法
def drink():
print("Cat drink")
# 这是一个静态方法
@staticmethod
def eat(food):
print("Cat eat {}".format(food))
# 这是一个对象方法
def get_name(self):
return self.name
# 这是一个类方法
@classmethod
def info(cls):
print(cls.age)
print(cls.area)
print(self.name)
# 实例化一只叫Kitty的黑猫
black_cat = Cat('Kitty')
# 有问题的方法,直接报错了
# black_cat.drink()
# 静态方法调用
black_cat.eat('fish') # 可以实例(black_cat)调用
Cat.eat('fish') # 也可以类(Cat)调用
# 类方法调用
black_cat.info() # 可以实例(black_cat)调用
Cat.info() # 也可以类(Cat)调用
# 对象方法调用
print(black_cat.get_name()) # 只能实例(black_cat)调用
到这里,你可能会问,这东西有啥用?
如果你只想写个脚本,执行一些简单的程序,那确实没啥用。你可以不关心这三个方法以及他们的调用,甚至连class类都不用写,直接def搞定。
但是,如果你想进阶,理解面向对象,它们很重要。
类方法
类名.方法名()
静态方法
类名.方法名()
对象方法
- 第一个参数是self
- 实例的方法
- 可以访问成员变量
- 只能实例调用,不能类调用