美文网首页
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