一、概念
class Man: pass class Man(): #()加不加都可以 pass class Man(object): pass # 以上三个表示相同的类
2)类的调用
class Man: pass new_man=Man print(new_man) #结果:<class '__main__.Man'> print(Man) #结果:<class '__main__.Man'> '''对象的表示方法:类名()''' print(Man()) #结果:<__main__.Man object at 0x1016c84e0>
注意:实例化两个对象,他们两个不相等,内存地址不一样
class Man: pass a=Man() b=Man() print(a) # <__main__.Man object at 0x00000212A43D9460> print(b) # <__main__.Man object at 0x00000212A43B76A0> print(a is b) # False
# 经典的面试题 print(Man() is Man()) # False # 如何进一步确定是不是同一个对象 print(id(a)) print(id(b))
三、类的命名
类的命名:大驼峰命名,两个单词的首字母大写(首字母大写) class PerfectManHelp
函数的命名:下划线命名,两个单词之间用下划线隔开 perfect_man_help
变量命名:下划线命名,perfect_man_help
注意:一个对象可能属于多个类
class Cat: pass jiafei = Cat() tom = Cat() blue = Cat()
print(jiafei) print(tom) print(blue) ''' <__main__.Cat object at 0x000002563CD49460> <__main__.Cat object at 0x000002563CD276A0> <__main__.Cat object at 0x000002563CD576D0> '''
四、属性
什么是属性?表示类、对象的特征。特征是别人不具备的.
1)类属性/实例属性区别一:
类属性:这个类的特征,这个群体的版本特征,别的类可能不具备,所有的成员都是一样的
实例属性:个体的特征(不是每个成员都一样),类当中的其他成员可能不具备
类属性的获取:类名.属性 可以先天定义,也可以手工添加
class Man: # 定义类属性 gender = '男' power = '强' print(Man.gender) # 男 Man类的gender属性 print(Man.power) # 强 Man类的power属性 # 手工添加 Man.hello = 'helle python' print(Man.hello) # helle python # 实例属性的手工添加 Leilei = Man() Leilei.handsome = 'yes' print(Leilei.handsome) # yes ShiTou = Man() print(ShiTou.handsome) # ShiTou没有定义handsome,这是错误的
2)类属性/实例属性区别二
类属性,可以被实例、对象访问
示例属性,不可以被类获取
类可以访问实例属性吗?Man.name 不可以
实例可以访问类属性吗?可以
class Man: #定义类属性 power = 'strong' gender = '男' Lei= Man() Lei.eye = 'big' #eye是Lei这个实例的属性 print(polo.eye) print(Man.eye)#类不能获取实例属性
2)初始化
要通过定义的类得到一个具体的对象。生出一个对象
对象个体,初始化过程保证生出来是不一样的
_ _init_ _(self) :在这里设置先天的属性
注意:self: 在类里面,表示一个对象它自己
先天设置的实例属性:self.属性 = 参数
语法:def _ _init_ _ (self,name):
self.name = name
class Man: #定义类属性 power = 'strong' gender = '男' def __init__(self,face_shape,name): #对象的实例化过程 #定义在类里面,定义实例属性用self.属性 = 参数 self.face = face_shape self.name = name Lei= Man('圆脸','polo') print(Lei.face,Lei.name)
先天设置好实例属性,可以后天修改
class Man: #定义类属性 power = 'strong' gender = '男' def __init__(self,name,face_shape = '圆脸'): #默认参数要放在位置参数的后面 #对象的实例化过 #定义在类里面,定义实例属性用self.属性 = 参数 self.face = face_shape self.name = name Lei= Man('Lei','方脸') print(Lei.face) Lei.face = '瓜子脸' print(polo.face) ''' 方脸 瓜子脸 '''
__init__ (self) 总结:
必须return None(不写就是return None,写一个return,也会返回None。return 其他值会报错)
传入的参数必须设置为实例属性,才能被对象访问到
实例方法中的self调用__init__ 的实例属性
class Man: #定义类属性 power = 'strong' gender = '男' def __init__(self,name,face_shape ): self.face = face_shape self.name = name def drink(self,brand): print('{}正在喝{}酒'.format(self.name,brand))#如果没有self,就没法调用name polo = Man('polo','方脸') print(polo.drink('茅台')) ''' polo正在喝茅台酒 None '''
一个实例方法可以调用别的实例方法,也可以调用类方法
class Man: #定义类属性 power = 'strong' gender = '男' @classmethod def eat(cls): print('在吃东西') def __init__(self,name,face_shape ): self.face = face_shape self.name = name def drink(self,brand): print('{}正在喝{}酒'.format(self.name,brand))#如果没有self,就没法调用name self.play_game() #play_game()在后面也会正常调用到 self.eat()#实例方法可以调用类方法 def play_game(self): print('在玩游戏') polo = Man('polo','方脸') print(polo.drink('茅台')) ''' polo正在喝茅台酒 在玩游戏 在吃东西 None '''
五、方法
方法:表示类、对象的行为,本质上是函数
属性名称:名词
方法:动词
方法 VS 函数:
1.方法里有self
2.方法放在类里面,缩进的
3.调用过程不一样,方法需要加前缀,类名或者对象名,函数要么不加,要么加模块名
class Man: # 定义类属性 gender = '男' power = '强' def drink(self): '''喝饮料''' pass def play_game(self): '''玩游戏''' pass # 对象.方法() Man().drink() Lei= Man() Lei.drink() # 行为是属于某一个人的,不能被类调用 # 不OK,Man.drink()
实例方法,对象方法:
1.第一个参数名称必须是self,
2.实例方法在调用时前缀是对象,不能是类(如对象Man( ),类是Man)
类方法:
1.在方法的上面添加装饰器@classmethod
2.把实例方法中的self改成cls
class Man: #定义类属性 power = 'strong' gender = '男' @classmethod #@表示装饰器 decorator def eatfood(cls): #cls就是class的缩写 print('在吃东西') print(Man.eatfood()) ''' 在吃东西 None # 类方法没有return,返回值是none,print会打印方法的返回值 '''
class Man: #定义类属性 power = 'strong' gender = '男' @staticmethod def hello(): #没有固定参数self print('在学习python') print(Man.hello()) print(Man().hello()) ''' 在学习python None 在学习python None '''
六、总结
1、实例属性和类属性的区别;
实例可以获取实例属性和类属性
类只能获取类属性
实例属性写到__init__里面
2、方法
实例方法:实例具备的,类不一定具备。类不能调用实例方法
类方法"类具备的,实例可以获取
静态方法:放在类里面的函数
3、__init__
表示对象的初始化过程,通常在里面定义实例属性
实力属性的值通过参数传递进来
参数必须赋值给实例属性,self.属性 = 参数
4、self/cls