小甲鱼Python笔记(类)
类和对象
类的构造方法 def __init__():
- 1 class People:
- 2 def __init__(self,name):
- 3 self.name = name
注意:在构造方法中的变量不用再次声明,必须有self,创建类的对象是用=
类的私有成员
让方法或者类变为私有,只要在它的名字前加上双下划线
- 1 class People:
- 2 __name = 'laowang'
- 3 def getname(self):
- 4 return self.__name
注意:类的私有成员可以通过方法访问,也可以通过 _类名__私有成员这种格式来访问
类的继承
class 子类(父类、基类、超类)
在继承构造函数的过程中,可以用以下两个方法,推荐方法2:
(1)调用未绑定的父类构造方法
- 1 class People:
- 2 def __init__(self):
- 3 self.name = 'aa'
- 4 class Student(People):
- 5 def __init__(self):
- 6 People.__init__(self)
- 7 self.son = 20
(2)使用super
- class People:
- def __init__(self):
- self.name = 'aa'
- class Student(People):
- def __init__(self):
- super().__init__()
- self.son = 20
super可以不带任何参数,但是当父类中有参数传入,super后的__init__要加上参数而且不能加上self
- 1 class People:
- 2 def __init__(self,name):
- 3 self.name = name
- 4 class Student(People):
- 5 def __init__(self,name,sno):
- 6 super().__init__(name)
- 7 self.name = name
- 8 self.sno = sno
类的组合
类之间没用明显继承关系可以用组合,比如一个电话簿的类由电话和地址类组合起来:
- 1 class Tel:
- 2 def __init__(self,x):
- 3 self.info = x
- 4
- 5 class Add:
- 6 def __init__(self,y):
- 7 self.info = y
- 8
- 9 class Notebook:
- 10 def __init__(self,x,y):
- 11 self.tel = Tel(x)
- 12 self.add = Add(y)
- 13 def print_info(self):
- 14 print("Tel:%s\nAdd:%s" %(self.tel.info,self.add.info))
类 类对象 实例对象
类对象就像C++中的static变量,一个对象有了实例对象后就将类对象的值覆盖了
属性名如果和方法名相同,属性会覆盖方法
绑定
对象.__dict__返回对象拥有的属性
对象调用后方法绑定到实例对象上del类后,a的方法还是存在的,因为A的方法和属性都是static,程序退出前不会消失
一些和类相关的BIF
issubclass(class, classinfo)
isinstance(object, classinfo)
hasattr(object, name) 注意第二个参数要用字符串格式
getattr(object, name[, default])
setattr(object, name, value) 设置属性
delattr(object, name) 删除属性,属性不存在抛出异常
property()
为什么用property
首先一个实例化的对象可以进行直接的赋值和修改,如c.age = 10,但是这样没法做参数检查,我就可以让c.age = 1000,这显然是不合理的
于是,用方法可以对参数进行检查,可以用c.setage(66)来设置年龄,但是这样就不方便了
函数property的基本功能就是把类中的方法当作属性来访问,为什么用方法来操作
- class C:
- def __init__(self,age = 10):
- self.age = age
- def getage(self):
- return self.age
- def setage(self,value):
- if 0 <= value <= 120:
- self.age = value
- else:
- print("年龄非法")
- def delage(self):
- del self.age
- x = property(getage,setage,delage)
魔法方法
(1)构造和析构
魔法方法总是被双下划线包围,它们总能在适当的时候自动被调用
__init__(self) 不能有返回值
__new__(cls[,]) 返回一个类对象,python自动调用,一般不需要重写,依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
__del__(self) del一个对象的时候被调用
(2)属性和访问
__getattr__(self,name) 定义当用户试图获取一个不存在的属性时的行为
__getattribute__(self,name) 定义当该类属性被访问时的行为
__setattr__(self,name,value) 定义当一个属性被设置的行为
__delattr__(self,name) 定义当一个属性被删除的行为
程序1:查看属性方法何时被调用
- class C:
- def __getattribute__(self,name):
- print("getattribute")
- return super().__getattribute__(name)
- def __getattr__(self,name):
- print("getattr")
- def __setattr__(self,name,value):
- print("setattr")
- super().__setattr__(name,value)
- def __delattr__(self,name):
- print("delattr")
- super().__delattr__(name)
当访问一个不存在的属性,就调用先调用getattribute,在调用getattr,访问存在的属性调用getattribut后显示其值
程序2:写一个矩形类,默认有宽高两个属性,如果给一个叫square的属性复制,那么说明这是一个正方形(Python基础教程151,小甲鱼45)
- class Rectangle:
- def __init__(self,width = 0,height = 0):
- self.width = width
- self.height = height
- def __setattr__(self,name,value):
- if name == "square":
- self.width = value
- self.height = value
- else:
- self.__dict__[name] = value
- def getarea(self):
- return self.width * self.height
(3)描述符(property的原理)
描述符就是将某种特殊类型的类的实例指派给另一个类的属性
__get__(self,instance,owner) 用于访问属性,它返回属性的值
__set__(self,instance,value) 将在属性分配操作中调用,不返回任何内容
__delete__(self,instance) 控制删除操作,不返回任何内容
(4)定制容器(Python基础教程144,小甲鱼47)
定制的容器对象是不可变的,需要前两个魔法方法;可变的需要4个魔法方法
1. 如果说你希望定制的容器是不可变的话,你只需要定义 __len__() 和 __getitem__() 方法。
2. 如果你希望定制的容器是可变的话,除了 __len__() 和 __getitem__() 方法,你还需要定义 __setitem__() 和__delitem__() 两个方法。
迭代器
BIF:iter()返回一个迭代器,next()返回下一个元素
对应的魔法方法__iter__() __next__()
用迭代器写的裴波那切数列:
- class Fibs:
- def __init__(self,n = 10):
- self.a = 0
- self.b = 1
- self.n = n
- def __iter__(self):
- return self
- def __next__(self):
- self.a,self.b = self.b,self.a+self.b
- if self.a > self.n:
- raise StopIteration
- return self.a
生成器
生成器是迭代器的一种实现
用yield或者圆括号
yield
圆括号
小甲鱼Python笔记(类)的更多相关文章
- 小甲鱼Python笔记(下)
二十八 二十九 文件 打开文件 open(文件名[,模式][,缓冲]) 注意open是个函数不是方法 模式: 缓冲: 大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认缓 ...
- 小甲鱼Python笔记(上)
基于Python 3.4.3 一 二 三 四 基础 print 三版必须加括号,二版不用加 alt + n :上一条语句 alt + p :下一条语句 打印三条hello 没有大括号,用缩进来表示 ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 小甲鱼python基础教程飞机大战源码及素材
百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取. 下载
- 小甲鱼Python3笔记
000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...
- 小甲鱼Python第十八讲课后习题
笔记: 1.函数与过程:过程(procedure)是简单的,特殊且没有返回值的:函数(Function)有返回值 Python严格来说只有函数没有过程 2.局部变量:在局部生效如在函数中定义的变量 3 ...
- 小甲鱼Python第十六讲课后习题--017函数
函数的定义用def,函数名后要用冒号 函数的返回:函数中使用return 测试题: 0. 你有听说过DRY吗? DRY是指Don't Repeat Yourself ,特指在程序设计以及计算中避免 ...
- 小甲鱼python疑难点
1.python生成器 2.while 1: num = input('请输入一个整数(输入Q结束程序):') if num != 'Q': num = int(num) print('十进制 -&g ...
- 一个任务:(小甲鱼python视频第29讲) 代码整理与总结
任务:将文件(record.txt)中的数据进行分割,并安装以下规则保存起来. 1.小甲鱼的对话单独保存为boy_*.txt的文件(去掉"小甲鱼:") 2.小客服的对话单独保存 ...
随机推荐
- 省选模拟赛 LYK loves rabbits(rabbits)
题目描述 LYK喜欢兔子,它在家中养了3只兔子. 有一天,兔子不堪寂寞玩起了游戏,3只兔子排成一排,分别站在a,b,c这3个位置. 游戏的规则是这样的,重复以下步骤k次:选择两个不同的兔子A和B,假如 ...
- Ubuntu 火狐浏览器中,鼠标选择文字被删除的解决办法
copy from :http://blog.csdn.net/shadow066/article/details/50628019 在终端中输入命令:ibus-setup 将 “在应用程序窗口中启用 ...
- Ubuntu 14.04.3 window10双系统情遇到'Disconnected: You are now offline'问题
笔电是win10系统,单独开除50G做了一个Ubuntu系统,安装的是14.04.03版本,安装成功后,发现wifi连接不上,选择wifi并输入密码后提示:“Disconnected: You are ...
- springsecurity 表达式一览
表达式 描述 hasRole([role]) 当前用户是否拥有指定角色. hasAnyRole([role1,role2]) 多个角色是一个以逗号进行分隔的字符串.如果当前用户拥有指定角色中的任意一个 ...
- Css Sprite 图片等比缩放图片大小
图片大小80*40,即每张图片大小40*40,如何以20*20显示图片?1. 首先看下如何以40*40显示第二张图片: 正常显示css代码 .sprite { background-image: ur ...
- 【BZOJ】2165: 大楼
[题意]从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳.初始在第0层第1个房 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- HTML如何编写为桌面程序
学过/用过HTML的人应该都知道HTML是标记语言,是在网页上执行/使用的,在这里小编告诉你HTML也可以用来做桌面程序,这种桌面程序一般是微客户端 工具/原料 html dreamweaver ...
- Tomcat 调优及 JVM 参数优化
Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...
- docker之设置开机自启动(二)
docker的自启动 通过sysv-rc-conf等管理 启动脚本 # docker.service #!/bin/sh sudo systemctl enable docker sudo syste ...