在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。

编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独特的个性。

根据类来创建对象被称为实例化,这让你能够使用类的实例。你可以在实例中存储一些信息或者定义一些操作。

你还可以编写一些类来扩展既有类的功能,让相似的类能够高效地共享代码。

1. 面向对象编程

1.1 创建和使用类

  1. class Car():
  2. def __init__(self, make, model, year):
  3. self.make = make
  4. self.model = model
  5. self.year = year
  6. def get_descriptive_name(self):
  7. long_name = str(self.year) + ' ' + self.make + ' ' + self.model
  8. return long_name.title()
  9. my_new_car = Car('audi', 'a4', 2016)
  10. print(my_new_car.get_descriptive_name())
  11. # 2016 Audi A4

Python中,类的首字母大写。类中的函数称为方法。

__init__()方法是一个特殊的方法,每当创建实例的时候,Python都会自动运行它。

这个方法中的形参self必不可少,还必须位于其他形参的前面。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

1.2 访问限制

  1. # test.py
  2. class Student(object):
  3. def __init__(self, name, score):
  4. self.__name = name
  5. self.__score = score
  6. def print_score(self):
  7. print('%s: %s' % (self.__name, self.__score))
  1. >>> from test import Student
  2. >>> student = Student('Bart Simpson', 59)
  3. >>> student.__name
  4. Traceback (most recent call last):
  5. File "<stdin>", line 1, in <module>
  6. AttributeError: 'Student' object has no attribute '__name'

上面通过实例访问变量__name时报错了。实际上,以两个下划线开头的__name为私有变量。

不能访问变量__name是因为Python解释器对外把__name改成了_Student__name

  1. >>> from test import Student
  2. >>> student = Student('Bart Simpson', 59)
  3. >>> student._Student__name
  4. 'Bart Simpson'

1.3 继承与多态

子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

1.3.1 继承

  1. class Car():
  2. def __init__(self, make, model, year):
  3. self.make = make
  4. self.model = model
  5. self.year = year
  6. def get_descriptive_name(self):
  7. long_name = str(self.year) + ' ' + self.make + ' ' + self.model
  8. return long_name.title()
  9. class ElectriCar(Car): # 定义子类时,必须在括号内指定父类的名称。
  10. def __init__(self, make, model, year):
  11. super().__init__(make, model, year) # 调用父类的__init__()方法,从而继承父类的所有属性
  12. my_tesla = ElectriCar('tesla', 'model s', 2016)
  13. print(my_tesla.get_descriptive_name())
  14. # 2016 Tesla Model S
  1. class ElectriCar(Car):
  2. def __init__(self, make, model, year):
  3. super().__init__(make, model, year)
  4. self.battery_size = 70 # 子类的属性
  5. def describe_battery(self): # 子类的方法
  6. print("This car has a " + str(self.battery_size) + "-kWh battery.")
  7. my_tesla = ElectriCar('tesla', 'model s', 2016)
  8. print(my_tesla.get_descriptive_name())
  9. my_tesla.describe_battery()
  10. # 2016 Tesla Model S
  11. # This car has a 70-kWh battery.

1.3.1 多态

  1. # 重写父类的方法(多态)
  2. class Parent:
  3. def myMethod(self):
  4. print ('调用父类方法')
  5. class Child(Parent):
  6. def myMethod(self):
  7. print ('调用子类方法')
  8. c = Child()
  9. c.myMethod() # 调用子类方法
  10. super(Child,c).myMethod() # 调用父类方法

1.3.3 将实例用作属性

  1. class ElectriCar(Car):
  2. def __init__(self, make, model, year):
  3. super().__init__(make, model, year)
  4. self.battery = Battery() # 将实例用作属性
  5. class Battery():
  6. def __init__(self, battery_size=70):
  7. self.battery_size = battery_size
  8. def describe_battery(self):
  9. print("This car has a " + str(self.battery_size) + "-kWh battery.")
  10. my_tesla = ElectriCar('tesla', 'model s', 2016)
  11. print(my_tesla.get_descriptive_name())
  12. my_tesla.battery.describe_battery()
  13. # 2016 Tesla Model S
  14. # This car has a 70-kWh battery.

1.3.4 多重继承

  1. class people:
  2. name = ''
  3. age = 0
  4. __weight = 0
  5. #定义构造方法
  6. def __init__(self,n,a,w):
  7. self.name = n
  8. self.age = a
  9. self.__weight = w
  10. def speak(self):
  11. print("%s 说: 我 %d 岁。" %(self.name,self.age))
  12. class student(people):
  13. grade = ''
  14. def __init__(self,n,a,w,g):
  15. people.__init__(self,n,a,w)
  16. self.grade = g
  17. def speak(self):
  18. print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
  19. class speaker():
  20. topic = ''
  21. name = ''
  22. def __init__(self,n,t):
  23. self.name = n
  24. self.topic = t
  25. def speak(self):
  26. print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
  27. class sample(speaker,student):
  28. a =''
  29. def __init__(self,n,a,w,g,t):
  30. student.__init__(self,n,a,w,g)
  31. speaker.__init__(self,n,t)
  1. >>> from test import people, student, speaker, sample
  2. >>> test = sample("Tim",25,80,4,"Python")
  3. >>> test.speak() # 调用的是speaker的speak()方法
  4. 我叫 Tim,我是一个演说家,我演讲的主题是 Python
  1. class sample(student,speaker): # 调换了一下括号内父类的顺序
  2. a =''
  3. def __init__(self,n,a,w,g,t):
  4. student.__init__(self,n,a,w,g)
  5. speaker.__init__(self,n,t)
  1. >>> from test import people, student, speaker, sample
  2. >>> test = sample("Tim",25,80,4,"Python")
  3. >>> test.speak()
  4. Tim 说: 25 岁了,我在读 4 年级

1.4 实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性。

  1. class Student(object):
  2. def __init__(self, name):
  3. self.name = name # 给实例绑定属性
  4. s = Student('Bob')
  5. s.score = 90 # 给实例绑定属性
  1. class Student(object):
  2. name = 'Student' # 类属性

实例属性属于各个实例所有,互不干扰。

类属性属于类所有,所有实例共享一个属性。

相同名称的实例属性将屏蔽掉类属性,不要对实例属性和类属性使用相同的名字。

2. 模块

Python中,模块就是一个后缀名为.py的文件。

使用模块还可以避免函数名和变量名冲突。但是,名字不要与内置函数名冲突。

为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是包目录名。

自己创建模块时要注意命名,不能和Python自带的模块名称冲突。

2.1 作用域

类似__xxx__这样的变量是特殊变量,可以被直接引用。

  1. # hello.py
  2. ······
  3. if __name__ == '__main__': # __name__为特殊变量
  4. test()

当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,因此这里将执行if语句块里面的代码。而如果我们在其他地方导入hello模块时,将不执行if语句块里面的代码。

类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接引用。

Python并没有一种方法可以完全限制访问private函数或变量,但是private函数或变量不应该被直接引用。

2.2 导入类

导入单个类

  1. from car import Car # from 模块名 import 类
  2. my_new_car = Car('audi', 'model s', 2016)

导入多个类

  1. from car import Car, ElectricCar

导入整个模块

  1. import car # import 模块名
  2. my_beetle = car.Car('volkswagen', 'beetle', 2016)

导入模块中的所有类

  1. from car import * # 不推荐

参考资料:

Python面向对象编程和模块的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  3. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  4. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  5. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  6. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  7. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  8. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  9. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

随机推荐

  1. 介绍HTTP协议的传输过程

    1.HTTP是面向事物的应用层协议,它使用TCP连接进行可靠传输,服务器默认监听在80端口 2.服务流程 从协议执行过程来说,当浏览器要访问www服务器时,首先要对服务器进行域名解析(DNS协议).一 ...

  2. React++ node.js ++SQL Sever ++MySQL++ python ++ php ++ java ++ c++ c#++ java ++ android ++ ios ++Linux+

    "C语言在它诞生的那个年代,是非常不错的语言,可惜没有OOP.当项目臃肿到一定程度,人类就不可控了. 为了弥补这个缺陷,C++诞生了.而为了应对各种情况,C++设计的大而全,太多复杂的特性, ...

  3. 软工个人博客-week7

    Part 1       No Silver Bullet - Essence and Accidents of Software Engineering软件工程中没用通用的方法或者技术让软件工程在短 ...

  4. jdk自带的jvisualvm-监控远程linux

    简介 jdk有好多自带的工具比如jconsole.jvisualvm.jstatd等 Windows的路径:%JAVA_HOME/bin/目录下,配置好环境变量直接用cmd执行jvisualvm命令即 ...

  5. Leetcode——50.Pow(x, n)

    @author: ZZQ @software: PyCharm @file: leetcode50_myPow.py @time: 2018/11/22 13:58 要求:实现 pow(x, n) , ...

  6. 单工程搭建springmvc+spring+mybatis(maven,idea)

    单工程搭建springmvc+spring+mybatis(maven,idea) 1.pom.xml <properties> <project.build.sourceEncod ...

  7. 开源通用爬虫框架YayCrawler-框架的运行机制

    这一节我将向大家介绍一下YayCrawler的运行机制,首先允许我上一张图: 首先各个组件的启动顺序建议是Master.Worker.Admin,其实不按这个顺序也没关系,我们为了讲解方便假定是这个启 ...

  8. 收获,不止oracle

    物理体系 体系结构图 缩放 1.Oracle由实例和数据库组成,上半部分的直角方框为实例instance,下半部分的圆角方框为数据库Database. 2.实例是由一个开辟的共享内存区SGA(Syst ...

  9. JavaScript中给onclick绑定事件后return false遇到的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. shell脚本--continue、break

    shell中的continue和break和其他语言中的使用方法一模一样:continue用于跳过本次循环,break用于中断本层的循环 下面是使用例子: #!/bin/bash #文件名:test. ...