美文网首页
Python学习

Python学习

作者: 逛逛_堆栈 | 来源:发表于2021-04-04 09:17 被阅读0次

第十天

上次我们已经简单提到了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面向对象编程的基本知识,包括类和对象,类属性和实例属性,最后介绍了类方法和静态方法(这部分了解即可)。大家多家实践,实践中理解面向对象的思想和使用。

相关文章

网友评论

      本文标题:Python学习

      本文链接:https://www.haomeiwen.com/subject/aedkkltx.html