前言
过几天要开始刷算法,结果提前预热了下发现python很多基础功能都不了解,只好赶快补救了,正好也是第一次写博客,就当是为几天后的刷题做准备了…本文知识点总结于其他文章,纯自用,以防以后忘了。
一、Python类的定义
- 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类的构造方法__init__():构造方法,当创建实例时,init() 方法被自动调用为创建的实例增加实例属性。目的是为了使对象初始化,且每个对象必须正确初始化后才能被正确调用。
二、类的构造方法__init__()
class XXX(Object): # 创建XXX类,并命名为XXX
def __init__(self,x): # 初始化一个属性r
self.x=x # 为要创建的实例赋予属性r赋值
def xx_function(self, ... , ...): # 类中定义的函数
pass ...
三、self应该如何描述
关于self: self是面向对象部分的内容,配合类一起用的。如果不了解面向对象,可以简单记为:只要是调用这个类的成员变量或者方法就加self,调用库函数什么的不加
self 代表类的实例,是通过类创建的实例。注意,在定义类时这个实例我们还没有创建!它表示的我们使用类时创建的那个实例,以方便我们清楚创建实例将如何参与访问属性
__init__第一个参数必须是self,它是类下面所有方法必须的参数,后续参数则可以自由指定,和定义函数没有任何区别
创建实例时就必须要提供除 self 以外的参数
xxx1 = XXX(1) # 创建实例时直接给定实例属性,self不算在内
print(xxx1.x) # 实例名.属性名->访问属性
注意:实例名.属性名 (xxx1.x) 访问属性,是我们上面XXX类__init__() 方法中 self.x 的 x 这个实例属性名,而不是__init__(self, x)方法中的 x 参数名,如下更加容易理解:
class XXX(object): # 创建XXX类
def __init__(self, X): # 约定成俗这里应该使用x,它与self.x中的x同名
self.x = X
xxx1 = XXX(1)
print(xxx1.x) #我们访问的是小写x
四、实例属性和类属性
在上述段落我们得知,实例属性其实就是self.x中的x,并不是__init__(self, x)中的x。
而类属性不同于实例属性每个实例各自拥有的特点,它是属于一整个类的属性,即将类作为一个对象,因此则所有实例都可以访问该类的属性,并且所有实例访问的类属性都是同一个。
e.g., 圆作为一个类,每个圆具有不同的半径(一个实例属性),但是所应用的圆周率一定是3.1415926…(类属性)。
五、代码
- 用__init__()方法定义一个实例:
class Student:
def __init__(self,name,number): # name和number要初始化的属性
self.name = name # self.后跟的name/number为实例属性名
self.number = number #为两个实例属性名赋值,所赋予的是实例属性
def student_info(self):
print('name: {}, number: {}'.format(self.name, self.number)) # 输出name和number
student = Student('zhang', 34) # ()内为实例属性,将赋予给self.实例属性名
student.student_info() # 先输出def中的print语句
print(student.__dict__) # 再输出一个字典
输出结果为
name: zhang, number: 34
{'name': 'zhang', 'number': 34}
obj.__ dict__是为了查看对象内部所有属性名和属性值组成的字典
- 不用__init__()方法定义类
class Student:
def student_info(self,name,number): # 没有初始化,直接过def的方法
print('name: {}, number: {}'.format(name,number))
student=Student() # 此处student因为没有初始化,没有任何值。
student.student_info('zhang',34) # 先输出def中的print语句
print(student.__dict__) # 由于student没有值,输出空集
输出结果为
name: zhang, number: 34
{}
如果没有__init__对self初始化,那么直接print(student.__ dict__)将会输出空集: {}, 说明Student这个实例并没有存储到数据。
总结
简单把自己不会的有关类的一些知识整合了下,肯定还有很多不会的,不过就先记这么多,以后遇到不会的再补充或重写一个完整的。