十二、python类和对象

一、概念

类calss:人以群分,物以类聚。种类/分类   具备相同特征或者行为的一个群体,模型(造对象)
对象object:又被称为实例 instance ,是一个群里当中的成员/个体。模型造出来的具体的东西
 
二、类和对象在Python中表示
 
1)类的定义
class 类名:
        类的组成部分
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会打印方法的返回值
'''
静态方法:
表示:在方法上面添加@staticmethod
不需要用self、cls作为固定参数,可以传参
是刚刚好放在一个类当中的普通函数而已,除了放在类中,和普通函数没什么区别
没有实际作用,和类或对象没有关系
为什么要用静态方法?为什么要把普通的函数放在类当中去?----》方便管理
静态方法调用:在静态方法前加类或对象名
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

self:在类里面,表示一个对象他自己,自我  (有的语言使用this)
cls:在类里面,表示一个类他自己
原文地址:https://www.cnblogs.com/zhangjx2457/p/13640658.html