zoukankan      html  css  js  c++  java
  • 十二、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:在类里面,表示一个类他自己
  • 相关阅读:
    docker入门——centos安装
    NET应用——你的数据安全有必要升级
    mysql事件机制——定时任务
    是时候升级你的Js工具了-分页【基于JQ】
    优美库图片系统
    爬虫之蜂鸟网图片爬取
    壁纸提取
    CSDN刷阅读数
    tkinter基础-输入框、文本框
    数据结构与算法之选择排序
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13640658.html
Copyright © 2011-2022 走看看