• python---面向对象(类和对象)


    面向对象的基本介绍

    开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑

    面向对象和面向过程都是解决问题的一种思路

     类和对象

    对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类

    具有相似内部状态和运动规律的实体的集合(或统称为抽象)。

    具有相同属性和行为事物的统称

    人以类聚 物以群分。

    类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在

    对象

    某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的

    可以直接使用的

     类的构成

    01). 类的名称:类名

    02). 类的属性:一组数据

    03). 类的方法:允许对进行操作的方法 (行为)

    定义类

    定义类时有2种形式:新式类和经典类,

                                            新式类:         class 类名(父类名):

                                            经典类:         class 类名:

    object是Python里所有类的最顶级父类

    类名 的命名规则按照"大驼峰命名法";

    1. #定义一个hero类
    2. class Hero(object):
    3. #定义一个实例化方法
    4. def info(self)
    5. print("英雄各有所见,何必追问出处")

    info 是一个实例方法,第一个参数一般是self,表示实例对象本身,当然了可以将self换为其它的名字,其作用是一个变量 这个变量指向了实例对象 

    创建对象

    python中,可以根据已经定义的类去创建出一个或多个对象。

    创建对象的格式为:(实例化对象)

            对象名1 = 类名()

            对象名2 = 类名()

            对象名3 = 类名()

    对象创建并添加属性后,在方法内通过self获取对象属性

     添加和获取对象的属性

    1. class Hero(object):
    2. '''定义一个英雄类,可以移动和攻击'''
    3. def move(self):
    4. '''实例方法'''
    5. print('正在前往事发地点....')
    6. def attack(self):
    7. '''实例方法'''
    8. print('发出了一招强有力的普通攻击')
    9. # 实例化一个对象
    10. t=Hero()
    11. # 给对象添加属性及相应的属性值
    12. t.name='泰达米尔'
    13. t.hp=2600 #生命值
    14. t.atk=450 #攻击力
    15. t.armor=200 #护甲值
    16. # 格式化输出
    17. print('英雄: %s的生命值: %d' %(t.name,t.hp))
    18. print('英雄: %s的攻击力: %d' %(t.name,t.atk))
    19. print('英雄: %s的护甲值: %d' %(t.name,t.armor))
    20. # 调用方法
    21. t.move()
    22. t.attack()

     

    魔法方法

    Python 的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法

    __init__

             初始化方法 用来赋值

    # 如果类面没有写__init__方法,Python会自动创建,但是不执行任何操作,    

    # 如果为了能够在完成自己想要的功能,可以自己定义__init__方法,    

    # 所以一个类里无论自己是否编写__init__方法 一定有__init__方法。

    __init__()方法,在创建一个对象时默认被调用,不需要手动调用

    __init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。

    1. class Hero(object):
    2. '''定义一个英雄类,可以移动和攻击'''
    3. def __init__(self): #self代表实例化对象
    4. #赋值 没有参数
    5. self.name='泰达米尔'
    6. self.hp=2600 #生命值
    7. self.atk=450 #攻击力
    8. self.armor=200 #护甲值
    9. def move(self):
    10. '''实例方法'''
    11. print('正在前往事发地点....')
    12. def attack(self):
    13. '''实例方法'''
    14. print('发出了一招强有力的普通攻击')
    15. def info(self):
    16. print('英雄: %s的生命值: %d' % (self.name, self.hp))
    17. print('英雄: %s的攻击力: %d' % (self.name, self.atk))
    18. print('英雄: %s的护甲值: %d' % (self.name, self.armor))
    19. # 实例化一个对象
    20. t=Hero()
    21. # 调用方法
    22. t.info()
    23. t.move()
    24. t.attack()
    1. class Hero(object):
    2. '''定义一个英雄类,可以移动和攻击'''
    3. def __init__(self,name,hp,attack,armor):
    4. #属性初始化 有参数
    5. self.name=name
    6. self.hp=hp #生命值
    7. self.atk=attack #攻击力
    8. self.armor=armor #护甲值
    9. def move(self):
    10. '''实例方法'''
    11. print('正在前往事发地点....')
    12. def attack(self):
    13. '''实例方法'''
    14. print('发出了一招强有力的普通攻击')
    15. def info(self):
    16. print('英雄: %s的生命值: %d' % (self.name, self.hp))
    17. print('英雄: %s的攻击力: %d' % (self.name, self.atk))
    18. print('英雄: %s的护甲值: %d' % (self.name, self.armor))
    19. # 实例化一个对象
    20. t=Hero('泰达米尔',2600,450,200)
    21. # 调用方法
    22. t.info()
    23. t.move()
    24. t.attack()

    通过一个类,可以创建多个对象,就好比 通过一个模具创建多个实体一样

    __init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)

    注意:

    1). 在类内部获取 属性 和 实例方法,通过self获取;

    2). 在类外部获取 属性 和 实例方法,通过对象名获取。

    3). 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;

    4). 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。

    __str__

    实例化对象时会调用__str__()方法,如果没有定义__str__()方法会打印一个对象的地址,如果定义__str__()并且有返回值,就会打印其中的返回值

    1. class ss:
    2. def __init__(self,age,name):
    3. self.age = age
    4. self.name = name
    5. if __name__=="__main__":
    6. s = ss(21,'jack')
    7. print(s)

    调用__str__方法,输出结果是该方法的返回值

    1. class ss:
    2. def __init__(self,age,name):
    3. self.age = age
    4. self.name = name
    5. def __str__(self):
    6. return "My name is %s and %s year" %(self.name,self.age)
    7. if __name__=="__main__":
    8. s = ss(21,'jack')
    9. print(s)

     __del__

    删除无用的内存对象(当程序结束会自动自行析构方法)
    当删除一个对象时,Python解释器也会默认调用一个__del__ 析构方法

    1. class Dog(object):
    2. def __init__(self,name):
    3. self.name =name
    4. print("__init__方法被调用")
    5. def __del__(self):
    6. print("__del__方法被调用")
    7. print("python解释器开始回收%s对象了" % self.name)
    8. p = Dog('Bob')
    9. del p

    __new__

    1. #__new__和__init__的作用
    2. class A(object):
    3. def __init__(self):
    4. print("这是 init 方法")
    5. def __new__(cls)
    6. print("这是 new 方法")
    7. return boject.__new__(cls)
    8. a = A()
    9. ##结果
    10. #这是 new 方法
    11. #这是 init 方法

    总结

    1). __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

    2). __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

    3). __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

     单例模式

    永远用一个对象得实例,避免新建太多实例浪费资源

    实质:使用__new__方法新建类对象时先判断是否已经建立过,如果建过就使用已有的对象

    1. class Foo(object):
    2. instance = None
    3. def __init__(self):
    4. self.name = 'alex'
    5. def __new__(cls):
    6. if Foo.instance:
    7. return Foo.instance
    8. else:
    9. Foo.instance = object.__new__(cls)
    10. return Foo.instance
    11. obj1 = Foo() #obj1和obj2获取的就是__new__方法返回的内容
    12. obj2 = Foo()
    13. print(obj1,obj2)
    14. ##结果返回两个对象的地址

  • 相关阅读:
    奇偶+逆序对构造法:arc102d
    给 Ubuntu 操作系统配置静态 IP
    Io流 小总结
    HarmonyOS应用开发者基础认证考试题目及答案
    Spring源码分析(十五)循环依赖2:源码分析
    MySQL 基础知识(八)之用户权限管理
    以vgg为backbone的简易图像检索系统
    mybatis中如何编写一个自定义插件?
    制造业SRM管理系统供应商全方位闭环管理,实现采购寻源与流程高效协同
    2023长城杯 web部分题目(seeking&easy_extension)
  • 原文地址:https://blog.csdn.net/m0_72596958/article/details/126470034