类和对象

​ 众所周知,面向过程:根据业务逻辑从上到下写代码。面向对象:将数据与函数绑定到一起,进行封装,这样能更快速的开发程序,减少了重复代码的重写过程。面向对象语言三个基本要素:封装 继承 多态把函数和全局变量和在一起就是封装。而python就属于面向对象的语言。

类和对象的概念

类与对象的关系和区别:类是抽象的概念,仅仅代表事物的模板。对象是一个能够看得到,摸得着的具体的实体比如:飞机是对象,飞机图纸是类。

类由三部分构成:

​ 类的名称:类名

​ 类的属性:一组数据

​ 一个特殊的对象:能够知道这个对象的class.

类的方法:允许进行的操作

类的抽象:拥有相同或者类似属性和行为的对象都可以抽象出一个类

类的属性

python调用__init__方法的作用:初始化对象

python调用__str__方法:

私有方法:外界不能直接调用

私有属性:可以添加,可以添加后取值,不可以直接取值。(以双下划线开头为私有变量,单下划线开头的为保护变量)

通过内部方法取值:

私有属性无法取值的原因是因为名字重整技术,其实可以通过_类名_属性可以访问:

在这里讲一下私有的原理:这是通过名字重整机制改变的。命名规则:_类名__num(尽量不要用)

python可以自己调用__del__方法,__del__是该对象被删除后调用的方法,注意:这里的删除是没有引用对象

完全删除后(没有引用对象):

测量对象的引用对象:用sys模块的sys.getrefcount,得出结果后减一。

__new__方法:创建对象

实例化对象相当于做三件事:

1.通过__init__来创建对象,然后找了一个变量来接收__init__的返回值。这个返回值表示创建出来的对象引用。

2.__init__(刚刚创建出来的对象的引用)

3.返回对象的引用。

__new__方法 和 __init__方法的区别:

1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。没有返回值。负责初始化

2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法,参数是cls。负责创建。__init__和__new__方法合起来相当于C++的构造函数。

下面讲一个新的概念:单例 单例是创建了多少个对象都是指向同一片内存。

只初始化一次对象:

继承

继承:可以少写代码。继承父类的方法和属性

继承可以多类继承。当子类和父类有什么不同时,可以进行重写(在子类中写一个和父类方法名相同的方法进行不同操作)

私有方法,私有属性不能被继承,可以被间接调用,如果在子类中实现了一个公有方法调用的方法或属性,那么这个方法是不能调用继承的父类的私有方法和私有属性

多继承:

当子类中的方法和父类方法名一样时会按照以下顺序去进行执行:

子类调用父类的三种方法:

父类.方法

super().init(不用传self,传参数)

super(父类,self).init(不传self,参数)可以根据父类指定调用哪一个父类

多态:在写完方法的时候并不知道调用的是什么方法。真正执行的时候才知道

类、实例、静态

类在程序中也属于一个对象,称之为类对象。通过类创建出来的对象称之为实例对象。

类属性(classmethod):类对象里的属性

实例属性:实例对象里的属性

实例属性和类属性的区别:实例属性和具体的某个实例对象有关系,且一个实例对象和另外一个实例对象是不共享属性的。类属性属于类对象,并且多个实例对象共享同一个类属性。

实例方法和类方法:

静态方法:

实例方法、类方法和静态方法的区别:实例方法和类方法必须传一个参数(实例方法self用来接收对象,类方法cls用于接收类),静态方法不需要参数(可以有)。

动态添加属性和方法

添加实例方法

注意:通过对象名添加的对象方法,只有这个对象能用

添加静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age

def eat(self):
print("吃ing")

@staticmethod
def staticRun():
print("跑ing")

Person.staticRun = staticRun # 类Person动态添加静态方法staticRun()

Person.staticRun() #通过类调用静态方法名

zhangsan = Person("张三", 18)
zhangsan.eat()
zhangsan.staticRun() #通过对象调用

注意:通过类名添加的静态方法,这个类以及这个类的所有对象都能使用

添加类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge

def eat(self):
print("---正在吃---")

@classmethod
def classRun(cls):
print("---正在跑---")

Person.classRun = classRun # 类Person动态添加类方法classRun()

Person.classRun() # 通过类名调用添加的类方法

zhangsan = Person("张三", 18)
zhangsan.eat()
zhangsan.classRun() #通过对象调用

注意:通过类名添加的类方法,这个类以及这个类的所有对象都能使用

限制添加

slots可以限制添加属性:这可以告诉解释器这个类的所有实例属性都在这了。可以节省大量内存。每个子类都要定义slots属性,因为解释器会忽略继承的slots属性。方法也可以进行限制

内建属性:

getattribute:属性拦截器

使用类名调用类属性时,不会经过__getattribute__方法,其他均要调用。(可以用来做日志)

----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%