第十天
上次我们已经简单提到了python中的类和对象,今天我们就来了解一下Python中的面向对象编程。
1、面向对象
在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系,并且在现实生活中一般是先有对象再有类,就如同某个人以及人类。而在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象,注意在程序中是现有类,再有对象,类是模型,对象是类的实例。
2、类和对象
对象是面向对象编程的核心。
具有相似特征和行为的事物的集合统称为类
对象是根据类创建的,一个类可以对应多个对象。
2.1、类的定义
类是由3部分组成的:
1、类的名称:类名。
2、类的属性:一组数据,比如性别。
3、类的方法:允许进行操作的方法,比如说话。
使用class关键字来声明一个类,基本格式如下:
class 类名:
类的属性
类的方法
class Student():
age = 10
def study(self):
print('学生在学习中ING')
2.2、对象创建
实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。
Python中用类的名称来实例化,并通过 init 方法接收参数。init 方法我们放在后面说明。
根据类创建对象的语法格式如下:
对象名 = 类名()
要想给对象添加属性,可以通过如下方式:
对象名.新的属性名 = 值
class Student():
age = 10
def study(self):
print('学生在学习中ING',self.age)
if __name__ == '__main__':
s = Student()
s.study()
2.3、构造方法
在实例方法中有一个特别的方法 :init ,这个方法被称为构造方法 。 构造方法用于构造该类的对象,当创建类的实例的时候,系统会自动调用构造方法,从而实现对类进行初始化的操作。python提供一个功能就是:若没有定义构造函数,python会自动提供一个只包含self参数默认的构造方法。这个同Java、C#等语言是一致的。注意,一旦类中存在了自己的构造方法,默认的构造方法就没了。
class Student():
def __init__(self):
self.name = '张三'
def study(self):
print('%s这名学生正在学习' %(self.name))
if __name__ == '__main__':
stu = Student()
stu.study()
# 张三这名学生正在学习
如果在创建对象的时候,传递参数,则上述代码修改为:
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
def study(self):
print('%s这名学生今年%d岁了,现在正在学习' %(self.name,self.age))
if __name__ == '__main__':
stu = Student('李四',18)
stu.study()
# 李四这名学生今年18岁了,现在正在学习
注意,此刻默认的构造方法已经不存在了。
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
2.4、析构方法
当删除一个对象来释放类所占用资源的时候,Python解释器默认会调用另外一个方法,这个方法就是del( )方法。del( )方法就是析构方法。在对象资源被释放的时候触发,帮助清理资源。其实python有个垃圾自动回收机制 , 每段时间会自动刷新整个内存,把内存垃圾东西删除。
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
print('析构方法执行')
if __name__ == '__main__':
stu = Student('李四',18)
del stu
2.5、self的使用
python中,我们发现只要是方法,第一个参数都会是self,那么这个self到底什么意思呢?
我们可以把它当做C++里面的this指针理解,表示的是对象自身,注意是对象不是类。
当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数传给self,开发者只需要传递后面的参数就可以了。
#在构造方法中,self参数(第一个参数)表示该构造函数正在初始化的对象
class Student():
def __init__(self,name):
self.name = name
stu = Student()
2.6、类变量和实例变量
类变量就是在类内定义的,并且不在方法内定义的,而且前缀无self作为引用。实例变量就是有self作为引用的存在类中的变量。类变量是所有对象共享的,在内存中只存在一个副本,在类中修改时,其他的对象也会跟着变。但是需要注意的是,如果是用对象来引用类变量进行修改的话,这里只是新建了和类变量同名的实例变量,并没有修改到。
class Employee():
empsCount = 0 #类变量
def __init__(self,name,age):
self.name = name #实例变量
self.age = age #实例变量
self.empsCount = self.empsCount + 1
if __name__ == '__main__':
emp1 = Employee('张三',18)
print(emp1.empsCount) # 1
emp2 = Employee('李四', 18)
print(emp2.empsCount) # 1
#这就是用对象来修改类变量,empsCount每次都是0开始,创建对象后变为1。
那么如何真正意义上实现类变量是共享的呢,我们通过类来访问就可以了。
class Employee():
empsCount = 0
def __init__(self,name,age):
self.name = name
self.age = age
Employee.empsCount = Employee.empsCount + 1
if __name__ == '__main__':
emp1 = Employee('张三',18)
print(emp1.empsCount) # 1
emp2 = Employee('李四', 18)
print(emp2.empsCount) # 2
为加深大家对类变量和实例变量的理解,大家注意理解如下代码:
class Student():
country = '中国' #类变量
def __init__(self,name,sex):
self.name = name #实例变量
self.sex = sex #实例变量
if __name__ == '__main__':
s1 = Student('张三','男')
s2 = Student('李四','女')
print(s1.country) # 中国
print(s2.country) # 中国
print(Student.country) # 中国
#现在使用类来修改
Student.country = 'chinese'
print(s1.country) # chinese
print(s2.country) # chinese
print(Student.country) # chinese
#现在使用对象来修改
s1.country = 'China'
print(s1.country) # China
print(s2.country) # chinese
print(Student.country) # chinese
# 用实例引用来修改类变量的时候并不是修改,而是新建了这个变量。
# 又由于python查找变量是由下往上查找的,所以会先查找出新建后的变量。
2.7、类方法和静态方法(了解)
说完了变量,我们来说下方法,Python中方法也是分为类方法和静态方法和实例方法。通常情况下,在类中定义的方法默认都是实例方法,实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象。而类方法和静态方法类似,都可以通过类调用。区别在于类方法第一个参数为cls,会自动绑定到类,而静态方法不会自动绑定到类。
类方法:
类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象,而是类)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
使用修饰器@classmethod来标识类方法,要想调用类方法,既可以通过对象名调用类方法,又可以通过类名调用类方法,这两种方法没有任何区别。但是推荐使用类名调用
class Student():
def __init__(self):
self.name = '张三'
self.sex = '男'
@classmethod
def info(cls):
print('调用的是类方法',cls)
if __name__ == '__main__':
Student.info() #类名调用
stu = Student()
stu.info() #对象调用
静态方法:
使用修饰器@staticmethod来标识静态方法;
静态方法是没有self参数,在静态方法中无法访问实例变量;
静态方法中不可以直接访问类属性,但是可以通过类名引用类属性;
静态方法跟定义它的类没有直接关系,只是起到了类似函数的作用。
class Student():
@staticmethod
def info(name):
print('调用的是静态方法',name)
if __name__ == '__main__':
Student.info('张三') #调用的是静态方法 张三
stu = Student()
stu.info('李四') #调用的是静态方法 李四
3、总结
这次我们主要介绍了python面向对象编程的基本知识,包括类和对象,类属性和实例属性,最后介绍了类方法和静态方法(这部分了解即可)。大家多家实践,实践中理解面向对象的思想和使用。
网友评论