| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> python与面向对象 -> 正文阅读 |
|
[Python知识库]python与面向对象 |
Python 从设计之初就已经是一门面向对象的语言了,正因为如此,在Python中创建一个类和对象是很容易的。 1、? 介绍: 简单的了解一些面向对象的基本特征: ? 类(Class):用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象就是类的实例。 ? 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,通常不作为实例变量使用。 ? 数据成员:类变量或者实例变量,用于处理类及其实例对象的相关数据。 ? 方法重写:如果从父类继承 的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(Override),已称为方法的重写。 ? 实例变量 :定义在方法中的变量,只作用于当前实例的类。 ? 继承:指一个派生类(Derived Class)继承基类(Base Class)的字段和方法,继承也允许把一个派生类的对象作为一个基类对象对待。例如:有这样的一个设计,一个Dog雷响的对象派生自Animal类,这是模拟“是一个(is-a)”的关系、 ? 实例化:创建一个类的实例,一个类的具体对象。 ? 方法:类中定义的函数。 ? 对象:通过类定义的数据结构实例,对象包括俩个数据成员(类变量和实例变量)和方法。 2、 定义语法: ? ?类必须在定义后才能被是哟个。定义一个类也就是定义这一类对象的模板,定义它的属性和方法。Python 中提供Class关键字来声明一个类,class中有成员属性和成员方法。Python中类的定义格式: class [类名]: ? ? [语法块] ? ? ?注意:类名和变量名一样区分大小写。字母相同但是大小写不同的类会被解释器视为两个不同的类。 ? 定义一个类: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class EmptyClass: pass ? ? ? 在这个例子中 我们定义了一个空的类,虽然 什么都没有做,但是不影响它的存在。 类的使用 ? ?在使用类之前需要实例化类,类实例化后会成为常见对象。创建对象和创建变量类似,需要先声明对象是那个类,同时指明变量名称。 #!/usr/bin/env python3 # -*- coding: utf-8 -*- class EmptyClass: pass empty = EmptyClass() print(type(empty)) ? ?执行结果: <class '__main__.EmptyClass'> ? 这个例子,创建一个EmptyClass 对象,变量名字是empty,同时在内存中为这个对象分配了内存空间。 3、? 类的构造方法 ? ?在创建实例时,很多类可能都需要有特定的初始状态,所以,一个类可以定义一个特殊的方法,叫做构造函数,在Python中,构造函数就是类的__init__? 方法,(init前后都有两个连续的短下划线)。 ? ?定义和使用构造函数 #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self): print ("汪汪汪!") dog = Dog() ? ?执行结果: 汪汪汪! ? ?当一个类定义了__init__方法,类在实例化时会自动调用__init__方法,用于创建新的类实例 。在这个例子中,新的实例备创建,同时执行了构造方法,运行了 print函数,注意:构造函数的第一个参数时”self“ ,不能漏掉 ? ?还有一点需要注意的是,构造方法的返回值必须是”None“。在定义构造方法的时候解释器不会报错,但是在实例化的狮虎Python会输出错误提示:”TypeError:__init_() should return None“. 4、类的属性 ? 在构造方法中我们可以初始化一些属性,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self, name): self.name = name self.age = 3 dog = Dog("旺财") print (dog.name) print (dog.age) ? 执行结果: 旺财 ? ? 注意:属性(或者叫成员变量、类变量)必须要使用”self“ 加上点的方式赋值,不能直接定义变量,直接定义的变量的生命周期指挥在函数内,函数执行完成变量完成就会被销毁,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self, name): self.name = name age = 3 dog = Dog("旺财") print (dog.name) print (dog.age) ? ?执行结果: 旺财 ? ? 执行这个例子,Python解释器将会提示我们:”Attribute Error:‘Dog’ object has no attribute 'age' ",即”Dog“ 对象没有”age“ 这个属性,其实函数__init__的第一个参数”self“ 指的就是实例本身,在C++等语言中对应的就是” this“ 指针,可以理解为对实例的属性进行赋值,Python在调用__init__ 函数的时候会自动地添加实例作为函数的第一个参数 5、类中的方法 ? 在类中定义的函数我们成为方法,其实在前面的章节中我们已经多次调用方法了,例如dict字典中的keys方法就是成员方法,自己定义成员方法也很简单,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self, name): self.name = name def play(self): print ("汪汪汪! 我是", self.name) dog = Dog("旺财") dog.play() print (dog.name) 执行结果: 汪汪汪! 我是 旺财 ? ?从这个例子可以看出,类中的方法和函数定义的方法基本相同,除了方法一定要定义在类里面并且第一个参数必须是”self“(参数名字不强制要求为”self“,但是一般使用名字”self“以与其他参数做区分),其他和函数定义的方法没有任何区别。 6、私有属性 ? 从前面的例子可以看到,在构造函数中定义了 属性,实例可以轻松地获取和修改属性的值。但是有时候我们需要限制实例随意修改属性,这时候就要用到私有属性,定义私有属性很简单,只要在定义属性名字的时候使用两条下划线作为开头,Python解释器就认为i这个属性是私有的,外部不能随便访问这个属性,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self, name): self.__name = name def play(self): print ("汪汪汪! 我是", self.__name) dog = Dog("旺财") dog.play() #错误 print (dog.__name) ? ?执行结果: 汪汪汪! 我是 旺财 ? ? 执行这段代码,Python解释器会输出一段错误提示,”Attribute Error:‘Dog’ object has no attribute '__name' “。虽然我们在构造方法中给”__name“? 赋值了,但是在实例中并不能直接访问到”__name“ 这个以两条下划线开头的成员变量,在平时的实际项目中,我们可以使用这个特性保护一些让用户随便修改的属性,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __init__(self, name): self.__name = name self.__age = None print (self.__name, "生成成功") def set_age(self, age): if not isinstance(age, int): print ("输入的年龄必须是数字!") return False if age <= 0: print ("年龄必须大于0!") return False self.__age = age def play(self): print ("汪汪汪! 我今年", self.__age ) dog = Dog("jerry") dog.set_age("hello") dog.set_age(-20) dog.set_age(5) dog.play() ? ?执行结果: jerry 生成成功 ? ? 在这个例子中,”__age“ 是私有属性,实例化后只能通过set_age方法设置年龄,在set_age方法中,我们限制了”age“ 只能是”int“ 并且其值要大于”0“,有效地限制了实例化后 数的内容,保证了”__age“? 是一个有效可用的数据。 7、私有方法 ? ?上述讲到私有属性,即只能在类内部被操作的属性,同样的,方法也有私有方法,和私有属性一样,私有方法只能在类内部被调用,例如: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Dog: def __say(self, name): print (name) def play(self): self.__say("汪汪汪") dog = Dog() dog.play() #错误 # dog.__say() ? ?执行这段代码,可以发现play 方法可以正常运行,但是__say 方法不能直接被实例”dog“调用,Python解释器会提示错误信息,”AttributeError:‘dog’object has no attribute ‘__say’ ”. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 2:15:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |