抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Python面向对象的一些个人笔记

Python/面向对象

class和type的区别

在 Python 中,type 和 class 都可以用来定义自己的类型。不过,它们的使用场景和语义略有不同。
class 是一种特殊的 type,它用来定义一个类,也就是一个具有一定属性和行为的对象类型,可以看做是对象的模板。类可以实例化为对象,对应于现实中的某个具体事物或概念。
而 type 则是一个内置函数,它用来获取一个对象的类型。当我们定义一个类时,实际上是在定义一种新类型。类是由 type 函数在运行时动态创建的,可以通过 type 函数来查看类的类型。
简单来说,class 是用来创建对象类型的,而 type 则是用来获取对象类型的。同时,class 还可以作为对象,它是一个可调用的对象,用来创建该类的实例。

object

在 Python 中,object 类可以看作是一个抽象类,它定义了所有类的基本行为。所有类都是从 object 类继承而来的,因此它是所有类的父类。所有对象都是 object 类的实例,因此 object 类可以看作是所有对象的祖先。

作为一个抽象类,object 并不是一个具体的类,也不应该被实例化。它只是定义了所有类所共有的方法和属性的接口。所有类都可以继承 object 类,并重写它的方法或添加新的方法和属性。

在 Python 中,使用 object 类作为基类是一种良好的设计习惯。如果一个类没有指定基类,那么它就默认继承 object 类。这样的好处是可以确保该类具有 object 类的所有基本特性,同时也可以使代码更加易于维护和扩展。

class的self只代表类的实例,代表当前对象的地址

foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。

_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

实例化

#Python/面向对象/实例化

实例化是把抽象的类赋予实物的过程

每次调用类时,打开的都是新的实例, 如

 >>> Class().object

>>> Class().count

以上并非是同个实例

>>>test = Class()

>>>test.object

>>>test.count

以上是同个实例, 将Class()实例化为test

在定义类时,可以为类添加一个特殊的__init__方法,当调用实例时,init()方法自动调用,也就是初始化函数,通常在初始化函数中定义类的属性,如

>>>self.name = '123'

在调用类来实例化时,需要提供除self以外的所有参数

类和实例的区别:

类是抽象的,是模板;而实例,就是根据模板创造出来的对象。例如动物,是一个抽象,而猫猫是具体的动物,是动物类的对象

实例对象绑定的属性只属于这个实例,绑定在一个实例上的属性不会影响其它实例;同样的,类也可以绑定属性,但是类的属性不属于任何一个对象,而是属于这个类。如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

类属性也是可以动态添加和修改的

需要注意的是,因为类属性只有一份,所以改变了,所有实例可以访问到的类属性都会变更

类属性和实例属性的优先级

属性可以分为类属性和实例属性,如果类属性和实例属性名字相同时,实例属性优先,如

class Animal(object):

    localtion = 'Asia'

    def __init__(self, name, age, localtion):

        self.name = name

        self.age = age

        self.localtion = localtion 

>>> dog = Animal('wangwang', 1, 'GuangDong')

>>> cat = Animal('mimi', 3, 'ChongQing')

>>> print(dog.localtion)  -> GuangDong

>>> print(cat.localtion)  ->  ChongQing

>>> print(Animal.localtion)  ->  Asia 

但实例无法修改类属性

评论