#4 Python面向对象(三)
前言
前两节讲解了Python面向对象的思想和Python类中各种变量的含义以及区别。肯定有小伙伴会问,类初始化时是否可以传入参数?如果有多个类中含有共同的函数方法,是否可以重复利用?本节就带着这些问题来继续深入类。Here We Go!
一、类的传参
1.1 带参数的初始化
还是以Doctor类为例,假如lisi是一位男性医生,现在要求在生成lisi这个对象时传入其性别。怎么办呢?
按照之前所学的,类似于函数的传参,肯定是:
lisi = Doctor('male')
的确,类带参数的初始化就是这么用的,那么再按照函数的思想,类源代码应该这么写:
class Doctor(name):
def talk(self):
print('My gender is {0}'.format(self.name)) lisi = Doctor('male') lisi.talk()
# 按照函数的思想,创建一个带参数的类
# 这是错误的!!!!
你已经看到,代码里已经标出这是错误的编写方法,不信的话来运行一下:
Traceback (most recent call last):
File "1.py", line 1, in <module>
class Doctor(name):
NameError: name 'name' is not defined # 竟然抛出name未定义异常
这是为什么呢?莫名其妙的竟然抛出未定义异常,关于这个问题将会放到下面(类的性质)来讲
那带参数的类要怎么编写呢?使用特殊方法 __init__(注意:init左右两边都是两个下划线) ,先来看个例子:
class Doctor():
def __init__(self, name):
¦ self.name = name def talk(self):
¦ print('My gender is {0}'.format(self.name)) lisi = Doctor('male') lisi.talk() # 运行结果:
My gender is male
通过上面的代码可以看出,要想创建一个带参数的类,类里面要创建一个__init__的方法,其实这个特殊的函数叫做构造函数,构造函数会在实例化类后默默运行一次,也就是说,只要实例化了一个类,那么就已经运行了构造函数。构造函数通常用来传入参数使用。以上就是类的传参。
1.2 类实例化后运行顺序
当一个类实例化后,类中的代码被首先运行,其次是构造函数里的代码,再然后是被调用的函数被运行,最后是析构函数被运行(析构函数将放在类的特殊方法讲)
class Doctor():
def __init__(self, name):
¦ print('我是第二个被运行的')
¦ self.name = name print('先运行我') def talk(self):
¦ print('只有调用我时才运行我') lisi = Doctor('male') lisi.talk() # 运行结果:
先运行我
我是第二个被运行的
只有调用我时才运行我
从上面的代码中可以清晰的看到每个代码块的运行顺序
二、面向对象的性质
面向对象共有三大性质:封装性、继承性、多态性。这三大性质是一定要记住的,不仅要记住,更要理解它们
#4 Python面向对象(三)的更多相关文章
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- Python面向对象三要素-多态
Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...
- Python 面向对象三(转载)
来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
- python 面向对象(三)类与类之间的关系 初始化方法一些类
###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...
- python 面向对象(三)--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- Python 面向对象(三) 魔术方法
__getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...
- python面向对象<三>
类属性.实例属性: class Tool(object): #属性(类属性)类对象(Tool) num = 0 #方法 def __init__(self,new_name): self.name = ...
随机推荐
- Hibernte
什么是CRM?(了解) CRM(customer relationship management)即客户关系管理,是指企业用CRM技术来管理与客户之间的关系.在不同场合下,CRM可能是一个管理学术语, ...
- pom string
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- RequireJS简单实用说明
OM前端框架说明 om前端框架采用RequireJS,RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就 ...
- Flutter 页面入栈和出栈
Docs demo import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp ...
- DevExpress XtraTabbedMdiManager删除Page
DevExpress XtraTabbedMdiManager删除Page 时,xtraTabbedMdiManager1.Pages.Remove()是没用的. 正确的应该是xtraTabbedMd ...
- spring MVC 的MultipartFile转File读取
转自:http://www.cnblogs.com/hahaxiaoyu/p/5102900.html 第一种方法: MultipartFile file = xxx; Commo ...
- 动态添加echarts
本次只贴js和jsp代码 jsp只需添加一个div即可, <div class="fLayout-right-box"> <hy:layoutArea width ...
- C语言面试题分类->字符串处理
1.strlen:计算字符串长度(不包含'\0') 实现想法:遍历字符串,直到'\0'结束 #include<stdio.h> #include<stdlib.h> #incl ...
- 批处理修改IP
1. 单次修改IP,批处理文件 newIP.bat @echo =========== Changing to IP : 222.192.41.%1 netsh interface ip set ad ...
- [Swift]LeetCode8. 字符串转整数 (atoi) | String to Integer (atoi)
Implement atoi which converts a string to an integer. The function first discards as many whitespace ...