python 面向对象知识点概括

目录

1 .面向对象介绍

2 .类

3 .对象

4 .对象的属性

5 .类对象

6 .方法 / 魔法方法

7 .继承


内容 :

一 面向对象介绍

为了更容易理解面向对象 , 我们先说面向过程:
面向过程 和 面向对象 都是一种思想

面向过程 :

面向过程是一种以过程(步骤)为中心的编程思想;
面向过程是人类的思考问题的一种习惯;
目的 →步骤1→步骤2→…→完成

面向对象 :

面向对象也是一种编程思想;
面向对象是一种以事物(对象)为中心的编程思想;
面向对象是以功能来划分问题,而不是步骤;


二 类

类是具有相同属性(特征)和行为(动作)的一组对象的集合
类就是分类、类别、模板、概念等,类是无形的、看不见、摸不着,不实际存在的
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象

类的构成

类(Class) 由3个部分构成

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法:允许对进行操作的方法 (行为)
class 类名:
    属性
    方法

三 对象

  • 客观世界中任何一个事物都可以看成一个对象,对象看得见、摸得着,实际存在的。
  • 对象是构成系统的基本单位。任何一个对象都应具有这两个要素:属性(Attribute)和行为(Behavior)。
  • 对象来自于某个类,对象不能单独存在。一个类可以产生千千万万个对象。
  • 对象和类的关系是,对象是类的实例,类是对象的模板。
  • 类是抽象的,几乎不占用内存,而对象是具体的,占用存储空间。
创建对象的格式:
对象名1 = 类名()

四 对象的属性

添加属性 :
class A:

    def p(self):
        print("AAAA")

a = A()
a2 = A()
a.name = '字母'

print(a.name)

这种方式添加属性, 只能给a添加 , a2 是没有这个属性的 , 这种方法也不常用 , 我们一般都在创建类的时候就定义好了对象的属性. 通过 __init__方法

私有属性 :

格式 :在属性名和方法名 前面 加上两个下划线 __

类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。


五 类对象

概念 : 类可以实例化对象,但是类本身也是对象,称为类对象,在类定义的时候被创建出来并且只有一个

类属性和实例的属性 :

实例属性就是i 对象属性
类属性 就是类对象的属性
它被所有类对象的实例对象所共有,在内存中只存在一个副本,
代码演示

class People(object):
    country = 'china' #类属性


print('类对象打印',People.country)
p = People() # 实例化一个对象
print('实例对象打印',p.country)
p.country = 'japan' # 对象修改类属性
print('实例对象修改类属性',p.country)  # 实例属性会屏蔽掉同名的类属性
print('原来的类对象',People.country)
del p.country  # 删除实例属性
print(p.country)

上面的代码运行后, 用对象确实修改了属性 , 那怎么原来的类属性还是没有消呢?

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
注意:对象不能直接修改类属性 , 但是可以借用类方法来修改类属性下面类方法有说到


六 方法 / 魔法方法

方法就是函数, 类里面定义的方法,可以使用对象去调用(类也可以调用)

魔法方法: 在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
_init_() :

创建对象后,python解释器默认调用__init__()方法;

class A:
    # 属性
    def __init__(self):
        print('------init--------')
        self.name = '字母大A'
        self.age = 1

_init_()方法,在创建一个对象时默认被调用,不需要手动调用
_init_(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。

__init__方法接收参数
class Cat:
    # 属性
    def __init__(self, name, age):
        print('------init--------')
        self.name = name
        self.age = age
            
tom = Cat('汤姆', 16)
  1. 在类内部获取 属性 和 实例方法,通过self获取;
  2. 在类外部获取 属性 和 实例方法,通过对象名获取。
  3. 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;
  4. 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。

__new__方法
class A(object):

    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls)


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

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

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

用处就是单例模式的时候用到 ,平时不写也行,默认执行


__str__方法
class Cat:
    # 属性
    def __init__(self, name, age):
        
        self.name = name
        self.age = age

    def __str__(self):
        return "我是一个猫"

tom = Cat('汤姆', 16)
print(tom)

如果没有用__str__方法,直接就打印对象地址
如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据
__str__方法通常返回一个字符串,作为这个对象的描述信息


__del__方法
当删除对象时,python解释器会默认调用一个方法,这个方法为__del__()方法

class Cat:
    # 属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __del__(self):
        print("%s 被 GM 干掉了..." % self.name)


tom = Cat('汤姆', 16)

有一个引用计数的概念 :
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。


说完魔法方法 , 说一下 类方法 和 静态方法

类方法 :

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。

定义类方法 格式 :

class People(object):
    country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def get_country(cls):
        return cls.country

对象调用类方法可以修改类属性哦~

静态方法:

需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
格式 :

class People(object):
    country = 'china'

    @staticmethod
    #静态方法
    def get_country():
        return People.country

静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用


七 继承

在程序中,继承描述的是多个类之间的所属关系。
一个类A里面的属性和方法可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。

# 父类
class A:
    def __init__(self):
        self.num = 10

    def print_num(self):
        print(self.num + 10)
# 子类
class B(A):
    pass

虽然子类没有定义__init__方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的__init__方法

子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类
只有一个父类的继承,叫做单继承

子类可以调用自己创建的方法,也可以调用父类的方法

重写: 子类写的方法和父类重名,就是对父类方法的重写

重写后,子类调用方法,就会执行自己方法里的内容

子类调用父类的方法 三种方式
  1. 父类类名.方法名(self)
  2. super(子类类名,self).方法名()
  3. super().方法名() 这种用的比较多

子类不可以用super调用父类的属性
私有方法和私有属性无法被继承

可以继承多个父类
如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值