1、对面向对象的理解
●
⾯向对象(Object Oriented)是⼀种程序设计思想,⽬的是降低 ⼤规模程序的设计复杂度,提⾼代码的重⽤性。
●
它是将程序的功能进⾏模块化的设计,抽象成有“属性”和“⽅法”的“类” ,通过根据这些“类”创建出来的对象实例,进⾏相互的调⽤,完成程序
●
我们要掌握在⾯向对象程序设计过程中的语法:定义类(类中的属 性、⽅法)、创建类的对象/实例、使⽤对象(访问属性、调⽤⽅法)。
●
类(class)—— 将⼀组具有共同特征的事物的这些特征抽象出 来,形成的概念就是类。
○ 类就是⼀系列特征的抽象,包括了:属性(数据)、⽅法(函数)
○ 类是抽象的,是模板、是蓝图、……
○ 在python中,数据类型就是类,类就是数据类型,例如:9是int数据类型的数据,9是int 类的数据
●
对象(object)—— 具体的事物
○ 对象是具体的,是根据类创建出来的。也称对象为“实例”(instance)
2、定义类
类名建议首字母大写,使用驼峰命名法,Python标准库中的类就遵循驼峰命名法
Python3中所有的类都默认继承了object类,不需要显式写出来
class 类名:
# 定义类属性,一般将此类不会更改的属性定义为类属性
属性名3 = 表达式
属性名4 = 表达式
# 定了类的初始化⽅法(魔术⽅法之一),⽅法的名字固定叫做__init__,该⽅法会在后续创建该
#类的对象实例时,⾃动被调⽤,类似c++中的构造函数,self类似c++中的this指针
# 主要在该⽅法中,为该类的对象实例定义属性。
def __init__(self, 其它形参):
# 定义实例属性 ,也称为对象属性
self.属性名1 = 表达式
self.属性名2 = 表达式
# 定义类⽅法,类方法中只能调用类成员,不能调用对象成员,cls指代本类
@classmethod
def ⽅法名3(cls, 其它形参):
编写该⽅法要实现的具体功能的代码
# 定义类⽅法
@classmethod
def ⽅法名4(cls, 其它形参):
编写该⽅法要实现的具体功能的代码
# 定义静态⽅法
@staticmethod
def ⽅法名5(形参):
编写该⽅法要实现的具体功能的代码
# 定义实例⽅法
def ⽅法名1(self, 其它形参):
编写该⽅法要实现的具体功能的代码
# 定义实例⽅法
def ⽅法名2(self, 其它形参):
编写该⽅法要实现的具体功能的代码
类中的方法间相互调用,需要使用self.方法名()的方式
Python和c++一个很大的区别是Python中单个对象可以给自己创建类中没有的属性
比如xiaowei.gender = '女',类中无论是类属性还是对象属性均为定义过gender属性,但在创建对象后可以自己创建。
对象在调用成员时,先到自己的空间中找,若找不到,就去类空间中去找
3、类成员 和 实例成员
●
实例成员是属于每个对象实例的,每创建⼀个实例,内存中就有⼀ 份独⽴的实例成员,实例成员只能由对象实例来访问调⽤。
●
类成员是属于整个类的,在创建对象前就已经类成员加载在内存中了,创建某个类的多个实例时,内存中只会有 ⼀份类成员,类成员既可以⽤类来访问调⽤,也可以⽤实例来访问调⽤。
类方法中只能调用类成员,不能调用实例成员,类方法的调用不依赖对象,所以当需要在对象创 建前完成一些动作,则 可以将其定义为类方法。
● 静态成员与类成员很相似,也只能访问类成员,不能访问对象成员。但又有区别:(1)装饰器名称不同。(2)静态方法无cls参数,更没有self参数,静态方法中要访问类成员,直接用类名.类成员的方式即可
4.魔术方法
python魔法方法详解_python 魔法方法-CSDN博客
__del__()析构函数,当释放对象空间时,就会自动调用__del__()函数,什么时候回释放对象的空间:(1)当普通对象出作用域时。(2)没有任何指针指向它时,会自动启动垃圾回收机制
import sys
# 返回参数中的指针指向的对象有多少个指针指向它
sys.getrefcount(指针)
del p # p是指针,表示删除p对指向对象的引用
5、私有化
类中成员名以__开头,即表示私有,一般设置对象属性为私有,并设置公有方法get()访问私有属性,set()修改私有属性,好处是方法内可以有if判断修改是否合理,不合理就不让修改
Python中的私有属性其实是伪私有,只要属性名以__开头,底层其实只是将属性重命名为
_所属类名__属性名,用对象._所属类名__属性名的方式在类外界依然可以访问到私有属性
dir()函数用于查看类公有成员或对象公有成员,返回值类型是list
print(dir(类名或对象名))
装饰器@property用于让私有属性的访问方式看起来像公有属性一样,但又有判断
class Student():
def __init__(self, name, age):
self.name = name
self.__age = age #私有属性__age
@property
def age(self): # 相当于get方法
return self.__age
@age.setter #依赖第一个age方法
def age(self, age): # 相当于set方法
if age > 0 and age < 120:
self.__age = age
else:
print('输入的年龄不合理')
s = Student('小明', 21)
s.age = 130 #实际调用的是第2个age方法,会打印出输入的年龄不合理
print(s.age) #实际调用的时第1个age方法,会打印出21