1.3 方法
属性表示是一个类当中的成员或类的特征,而方法是??
方法:表示类、对象的行为,方法本质上是函数,是一个特殊的函数
- 属性名称一般为名词,
- 方法名称一般为动词
1.3.1 方法 VS 属性
- 1、self
- 2、放在类里面,存在缩进的,否则就是普通函数了
- 3、调用过程不一样,方法需要加前缀,类名或者对象名 而函数前面要么不加,要么加的是模块名称
1.3.2 实例方法、对象方法的特征:
1)定义
- 1、实例方法直接定义在类中
- 2、第一个参数名称,必须规定是self
- 3、实例方法在调用的时候,前缀是对象,不能是类,
2) 实例方法的访问:
只有该类的实例对象都可以访问,访问实例方法的时候会自动将对象本身当成承诺书,传给self接收
class Man:
#定义类属性
gender = '男'
power = '强'
handsome = 'very'
def drink(self):
"喝"
pass
def play_game(self):
"玩游戏"
pass
#对象.方法()
Man().drink()
xiaoyi = Man()
xiaoyi.drink()
#类.方法()
# Man.drink() #不可
"""报错,行为是属于某一个人的,不能被类调用
TypeError: drink() missing 1 required positional argument: 'self'
"""
1.3.3 类方法:本质上还是一个函数
1)定义:
- 1、在方法的上面添加装饰器:@classmethod
- 2、把实例方法当中的self改为cls代表class的缩写,第一个参数必须是当前类的对象,该参数名一般定义为’cls‘, 通过它来传递类的属性和方法(不能传实例的属性和方法)
2)调用:
实例对象和类对象都可以使用
class Man:
#定义类属性
gender = '男'
power = '强'
handsome = 'very'
#装饰器,代表封装这个函数的功能,用了就是类方法
@classmethod
def eat(cls):
print("正在吃")
#类.方法()
#打印函数的调用打印出来的是函数的返回值
print(Man.eat())
print(Man().eat())
"""
正在吃
None
正在吃
None ===>因为打印的是返回值,没有return打印为None
"""
3)应用场景:
需要站在类的角度执行某个行为时,就应该定义为类方法
1.3.4 静态方法
1)定义:
使用装饰器@staticmethod,参数随意,没有’self‘和’cls‘参数,但是方法体中不能使用类或实例的任何属性和方法
class Man:
@staticmethod
def tianqi(self):
print("天气不错")
#静态方法使用
Man.tianqi()
"""静态方法不需要用self
TypeError: tianqi() missing 1 required positional argument: 'self'
"""
2)调用:
实例对象和类对象都可以调用
3)应用场景:
存放逻辑代码,内部不需要引用类属性和实例属性
4)是什么?
是刚刚好放在一个类当中的普通函数而已,除了放在类当中和普通函数没什么区别
指:把其放到类外面,和普通函数无区别只是没有装饰器@staticmethod,
class Man:
@staticmethod
def tianqi():
print("天气不错")
和下列普通函数无差别
def tianqi(self):
print("天气不错")
没有实际作用,和类或者对象没有关系(联系)
5) 为什么要用静态方法,为什么要把普通函数放到类当中去?
ANS:方便管理,把普通函数放在指定的类中,这样查找该函数就可以在指定类寻找,整个代码管理不至于太混乱 和类方法无关系,只是放在类里面
6)调用静态方法
静态方法(普通函数):只需要在调用静态方法,前面加上类名或者对象名
而 类外面的普通函数:普通函数不需要加类、对象名,不是模块调用,也不用加模块
class Man:
#定义类属性
gender = '男'
power = '强'
handsome = 'very'
@staticmethod
def tianqi():
print("天气不错")
#调用静态方法
Man.tianqi()
Man().tianqi()
实际使用过程当中:
- 实例方法:占98%,实例方法占大多数情况
- 类方法、静态方法:工作一般用不到
>在实际情况中,不知道用什么方法,就用实例方法
>类方法:后续会有特殊情况介绍
>静态方法:使用静态方法要么可以写为实例方法,要么定义一个普通函数,可使用普通函数代替,不是必须的(方便管理)