Python入门笔记:面向对象编程基础(类与对象)

  • Post author:
  • Post category:python



slogan:

我学编程就是为了赚钱,后来发现它不只是能赚钱…




面向对象编程基础



面向对象的一些基础概念

  • 类(Class):

    用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 类变量:

    类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。


    数据成员:

    类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

  • 方法重写:

    如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

  • 局部变量:

    定义在方法中的变量,只作用于当前实例的类。

  • 实例变量:

    在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。

  • 继承:

    即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例图,Dog是一个Animal)。

  • 实例化:

    创建一个类的实例,类的具体对象。

  • 方法:

    类中定义的函数。

  • 对象:

    通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。



1.1 定义类

在Python中可以使用

class

关键字定义类,然后在类中通过之前学习过的函数来定义方法,这样就可以将对象的动态特征描述出来,代码如下所示。

class Student(object):

    # __init__是一个特殊方法用于在创建对象时进行初始化操作
    # 通过这个方法我们可以为学生对象绑定name和age两个属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def study(self, course_name):
        print('%s正在学习%s.' % (self.name, course_name))

    # PEP 8要求标识符的名字用全小写多个单词用下划线连接
    # 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识)
    def watch_movie(self):
        if self.age < 18:
            print('%s只能观看《熊出没》.' % self.name)
        else:
            print('%s正在观看岛国爱情大电影.' % self.name)


说明:

写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。




1.2 创建和使用对象

当我们定义好一个类之后,可以通过下面的方式来创建对象并给对象发消息。

def main():
    # 创建学生对象并指定姓名和年龄
    stu1 = Student('小明', 18)
    # 给对象发study消息
    stu1.study('Python程序设计')
    # 给对象发watch_av消息
    stu1.watch_movie()
    stu2 = Student('王大锤', 15)
    stu2.study('思想品德')
    stu2.watch_movie()


if __name__ == '__main__':
    main()



1.3 访问可见性问题

对于上面的代码,有C++、Java、C#等编程经验的程序员可能会问,我们给

Student

对象绑定的

name



age

属性到底具有怎样的访问权限(也称为可见性)。因为在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头,下面的代码可以验证这一点。

class Test:

    def __init__(self, foo):
        self.__foo = foo	

    def __bar(self):
        print(self.__foo)
        print('__bar')


def main():
    test = Test('hello')
    # AttributeError: 'Test' object has no attribute '__bar'
    test.__bar()
    # AttributeError: 'Test' object has no attribute '__foo'
    print(test.__foo)


if __name__ == "__main__":
    main()


说明:

self代表类的实例,而非类类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来妨碍对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。

class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print('__bar')


def main():
    test = Test('hello')
    test._Test__bar()
    print(test._Test__foo)


if __name__ == "__main__":
    main()

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问。如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,

在Python中,实例的变量名如果以__开头

,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。



  • Python内置类属性
属性 描述

__dict__
类的属性(包含一个字典,由类的数据属性组成)

__doc__
类的文档字符串

__name__
类名

__module__
类定义所在的模块(类的全名是’

main

.className’,如果类位于一个导入模块mymod中,那么className.

module

等于 mymod)

__bases__
类的所有父类构成元素(包含了一个由所有父类组成的元组)



版权声明:本文为weixin_44880296原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。