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
但实例无法修改类属性