Python入门基础学习(面向对象)
Python基础学习笔记(四)
面向对象的三个基本特征:
- 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内
- 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能进行拓展
- 多态性:派生类具有基类的所有非私有数据和行为以及新类自己定义的所有数据或行为,即子类具有两个有效类型:子类的类型及其继承基类的类型。对象可以表示多个类型的能力称为多态性
类与对象的概念:
类和变量是面向对象编程的两个核心概念
类:对一群具有相同特征(属性)或者行为(方法)的事物一个统称,抽象的,如:王者荣耀里的泛指的英雄
对象:由类创建出来的一个具体存在,可以直接使用,如:英雄中的李白
类的设计:
1.类型:满足大驼峰命名法(每个单词首字母大写,单词与单词之间没有下划线)
2.属性:事物具有什么样的特征
3.方法:事物具有什么样的行为
属性与方法的确定:
1.对对象特征的描述,可以定义成属性
2.对象具有的行为(动词),通常可以定义成方法
类的定义以及创建对象:
类定义的格式:
创建对象格式:
实例属性:
通过"self.变量名"定义的属性,称为实例属性,也称为实例变量,每个实例包含类的一个单独副本
初始化(一般在__int__函数中):self.实例变量名 = 初始值
其他函数中可以通过self访问:self.实例变量 = 值
创建对象实例,通过对象访问:obj1.实例变量名 = 值
例子:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_hi(self):
print('您好!我叫%s'%(self.name))
person = Person('HHS','21')
person.say_hi()
print('今年{0}'.format(person.age))
输出:
您好!我叫HHS
今年21
类属性:
Python也允许声明属于类本身的变量,即类变量、静态属性
类属性属于整个类,不是特定实例的一部分,而是所有实例之间共享的一个副本
初始化(一般在类体中):类变量名 = 初始值
类的访问:类名.类变量名 = 值
例子:
class Person:
count = 0
name = "HHS"
#test
Person.count += 1
print(Person.count) #1
print(Person.name) #HHS
p1 = Person()
p2 = Person()
print((p1.name,p2.name)) #('HHS', 'HHS')
Person.name = '华南理工大学广州学院'
print((p1.name,p2.name)) #('华南理工大学广州学院', '华南理工大学广州学院')
p2.name = '计算机科学与技术'
print((p1.name,p2.name)) #('华南理工大学广州学院', '计算机科学与技术')
p2.count += 1
print((Person.count,p1.count,p2.count)) #(1, 1, 2)
说明:
类属性如果通过‘obj.属性名'访问,则属于该实例的实例属性,虽然类属性可以使用对象实例来访问,但这样容易造成困惑。所以建议不要这样使用,而是应该使用标准的访问方式:类名.类变量名
私有属性和公有属性:
Python类的成员没有访问控制限制,与其他面向对象的语言不同
通常约定两个下划线开头且吧不以两个下划线结束的属性为私有(private),其他为公共(public)
不能直接访问私有属性,但可以在方法中访问
class A:
__name = 'class A'
def get_name():
print(A.__name)
#test
A.get_name() #class A
A.__name #AttributeError: type object 'A' has no attribute '__name'
特殊属性:
以双下划线开始和结束的方法,称为特殊方法
常见的特殊方法:
object.__dict__ 对象的属性字典
object.__class__ 对象所属的类
class.__bases__ 类的基类元组
class.__bases__ 类的基类
class.__name__ 类的名字
class.__mro__ 方法查找顺序,基类的顺序
class.__subclasses__() 子类序列
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_hi(self):
print('您好!我叫%s'%(self.name))
person = Person('HHS','21')
print(person.__dict__) #object.__dict__ 输出:{'name': 'HHS', 'age': '21'}
print(person.__class__) #object.__class__ 输出:<class '__main__.Person'>
print(Person.__bases__) #class.__bases__ 输出:(<class 'object'>,)
print(Person.__base__) #class.__base__ 输出:<class 'object'>
print(Person.__name__) #class.__name__ 输出:Person
print(Person.__mro__) #class.__mro__ 输出:(<class '__main__.Person'>, <class 'object'>)
print(Person.__subclasses__()) #class.__subclasses__() 输出:[]
实例方法:
类方法的第一个参数一般为self,这种方法称为实例方法
格式:def 方法名(self,[形参列表]):函数体
注意:第一个参数虽然为self,但是调用时,用户不需要传给该参数值(self相当于this)
class Person:
def say_hi(self,love):
# self.love = love 这句不写也可以正常输出
print('我喜欢的游戏为{0}'.format(love))
p = Person()
p.say_hi('自由幻想手游')
静态方法:
Python允许声明属于与对象实例无关的方法,称为静态方法,静态方法不对特定实例进行操作,在静态方法中访问对象实例会报错。静态方法通过装饰器@staticmethod来定义,其声明格式如下:
@staticmethod
def 静态方法名([形参列表]):
函数体
#静态方法一般通过类名来访问,也可以通过对象实例来调用
#如:类名.静态方法名([实参列表])
例子:
class Temperature:
@staticmethod
def c2f(t_c): #将摄氏度转换为华氏温度
t_c = float(t_c)
t_f = (t_c * 9/5) + 32
return t_f
类方法:
Python也允许声明属于类本身的方法,即类方法。类方法不对特定实例进行操作,通过@classmethod来定义,第一个形参必须为类对象本身,通常为cls,格式如下:
@classmethod
def 类方法名(cls,[形参列表]):
函数体
#类方法一般通过类名来访问,也可通过对象实例调用
#格式如下
类名.类方法名([实参列表])
例子:
class Foo:
classname = 'Foo'
def __init__(self,name):
self.name = name
def f1(self):
print(self.name)
@staticmethod
def f2():
print('static')
@classmethod
def f3(cls):
print(cls.classname)
__init__方法(构造函数)和__new__方法:
Python类中,可以定义特殊的方法:__new__方法和__init__方法
__new__是一个类方法,创建对象时调用,返回当前对象的一个实例,一般无须重载该方法
__init__是一个构造函数,用于执行类的实例和初始化工作,创建完对象后调用,初始化当前对象的实例,无返回值
__del__方法(析构函数):
Python类体中,可以定义一个特殊的方法__del__方法
用于实现销毁类的实例所需的操作,如释放占用的非托管资源(打开的文件,网络连接等)
默认情况下,对象不再被使用时,__del__方法运行,由于Python解释器实现自动垃圾回收,无法保证这个方法何时运行
例子:
class Offer:
def __init__(self,name):
self.name = name
print('{0}太晚参加秋招'.format(name))
def __del__(self):
print('{0}炸了,只能去搬砖了'.format(self.name))
of1 = Offer('HHS')
del of1
__str__方法:
在Python中,使用print输出对象变量,默认情况下,会输出这个变量的引用对象时由哪一个类创建的对象,以及内存地址
如果希望print(对象变量),可以打印自定义内容,可以利用__str__方法
注意:此方法必须返回一个字符串
class Offer:
def __init__(self,name):
self.name = name
def __str__(self):
return '这是一个求Offer的对象'
of1 = Offer('HHS')
print(of1) #输出:这是一个求offer的对象
方法的重载:
在其他程序设计语言中,方法可以重载,即可以定义多个重名方法,只要保证方法签名唯一。方法签名包括三个部分:方法名,参数数量和参数类型
但Python本身为动态语言,方法的参数没有声明类型,参数的数量由可选参数和可变参数来控制,故Python对象方法不需要重载,定义一个方法即可实现多种调用,从而实现相当于其他程序设计语言的重载功能
继承:
派生类:Pyhon支持多继承,即一个派生类可以继承多个基类。
声明如下:
class 派生类名(基类1,[基类2,...]): #若无继承,默认继承object,派生类(object)
类体
注意:声明派生类时,必须在其构造函数中调用基类的构造函数。
格式:基类名.__init__(self,参数列表)
例子:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_hi(self):
print(self.name,self.age)
class Student(Person):
def __init__(self,name,age,stu_id):
Person.__init__(self,name,age)
self.stu_id = stu_id
def say_hi(self):
Person.say_hi(self)
print(self.stu_id)
p = Person('H',10)
p.say_hi()
stu = Student('HHS',21,'9199')
stu.say_hi()
输出:
H 10
HHS 21
9199
对象的引用:
对象的赋值实际上是对象引用,创建一个对象并把它赋值给一个变量,该变量是指该对象的引用其id()返回值保持一致
例如:a = b
对象的浅拷贝:
Python拷贝一般是浅拷贝,即拷贝对象,对象中包含的子对象不拷贝,而是引用一个子对象
- 切片操作 #a[::-1]
- 对象实例化 #list(a)
- copy模块的copy函数 #copy.copy(a)
对象的深拷贝:
如果要递归拷贝对象中包含的子对象,可以使用copy模块的deepcopy函数
import copy
a = [1,'hhs',[1,2,3]]
a1 = copy.copy(a)
a2 = copy.deepcopy(a)
print(id(a[2]),id(a1[2]),id(a2[2]))
#输出:5517400 5517400 7564344
Python入门基础学习(面向对象)的更多相关文章
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python入门基础学习 一
Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...
- Python 入门基础学习
Python入门学习 我们使用python3.0版本 首选来入门 带你进入Hello World >>> print ("Hello World")Hell ...
- Python入门基础学习(文件与异常处理)
Python基础学习笔记(七) 捕获异常的语法格式: 文件的基本操作: 打开文件 读.写文件 关闭文件 read方法 --读取文件: open函数的第一个参数是要打开的文件名(文件名区分大小写) 如果 ...
- Python入门基础学习(时间模块,随机模块)
Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...
- Python入门基础学习(模块,包)
Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...
- Python入门基础学习(函数)
Python基础学习笔记(三) 函数的概念: 所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用 函数的使用包含两个步骤: 1.定义函数 --封装独立的功能 2.调用函数 --享受 ...
- Python入门基础学习(列表/元组/字典/集合)
Python基础学习笔记(二) 列表list---[ ](打了激素的数组,可以放入混合类型) list1 = [1,2,'请多指教',0.5] 公共的功能: len(list1) #/获取元素 lis ...
随机推荐
- Spring Boot启动提示:org.apache.catalina.LifecycleException: A child container failed during start
一.问题回顾 最近在做一个新项目,从git上下载导入idea后,启动项目,但是报了如下错误: java.util.concurrent.ExecutionException: org.apache.c ...
- IT兄弟连 HTML5教程 CSS3属性特效 文字描边
用CSS3实现的文字描边效果,一个CSS3文字特效实例,字体可以自己随意改,字体颜色也可以自己改.IE9以下浏览器无效果,所以提醒大家测试时候要使用Google Chrome.-webkit-text ...
- mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F
本文章转载自:https://www.cnblogs.com/coprince/p/7485968.html 原文如下: 问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varch ...
- WPF数据可视化-瀑布图
实现方式一: 将数据(Point[])根据索引沿X轴使用虚拟画布进行绘制,每个数据绘制大小为1px * 1px:最终绘制出的宽度等于数据的总长度.标记并存储当前绘制的图为PreviousBitmap; ...
- SpringMVC架构模拟
这次来学习一下SpringMVC的源码. 对于常见的项目架构模式,比如大名鼎鼎的SSM(SpringMVC,Spring,Mybatis)框架. SpringMVC ->web层(Control ...
- ES6面向对象 动态添加标签页
HTML <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml&quo ...
- 一文解读JSON (转)
JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天我们一起来学习一 ...
- VUE组件 之 高德地图地址选择
注:本文基于上一篇文章[ Vue-Cli 3.0 中配置高德地图] ,采用直接引入高德 SDK 的方式来使用高德地图api 一.效果图 二.组件要实现的功能 1. 如果有传入坐标点,则定位到坐标点 2 ...
- Troubleshooting: High Version Count Issues
--查询版本高的原因 select * from v$sql_shared_cursor where sql_id=''; Configuring Download the script in the ...
- PWA 学习笔记(三)
基础技术简介 Promise: 1.ES6 引入的一种异步编程的解决方案,通过 Promise 对象来提供统一的异步状态管理方法 2.一般在使用 Promise 对象的时候,首先需要对其进行实例化 3 ...