类和对象

类的构造方法 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笔记(类)的更多相关文章

  1. 小甲鱼Python笔记(下)

    二十八 二十九  文件 打开文件 open(文件名[,模式][,缓冲]) 注意open是个函数不是方法 模式: 缓冲: 大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认缓 ...

  2. 小甲鱼Python笔记(上)

    基于Python 3.4.3 一 二 三 四  基础 print 三版必须加括号,二版不用加 alt + n :上一条语句 alt + p :下一条语句 打印三条hello 没有大括号,用缩进来表示 ...

  3. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  4. 小甲鱼python基础教程飞机大战源码及素材

    百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取. 下载

  5. 小甲鱼Python3笔记

    000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...

  6. 小甲鱼Python第十八讲课后习题

    笔记: 1.函数与过程:过程(procedure)是简单的,特殊且没有返回值的:函数(Function)有返回值 Python严格来说只有函数没有过程 2.局部变量:在局部生效如在函数中定义的变量 3 ...

  7. 小甲鱼Python第十六讲课后习题--017函数

    函数的定义用def,函数名后要用冒号 函数的返回:函数中使用return   测试题: 0. 你有听说过DRY吗? DRY是指Don't Repeat Yourself ,特指在程序设计以及计算中避免 ...

  8. 小甲鱼python疑难点

    1.python生成器 2.while 1: num = input('请输入一个整数(输入Q结束程序):') if num != 'Q': num = int(num) print('十进制 -&g ...

  9. 一个任务:(小甲鱼python视频第29讲) 代码整理与总结

    任务:将文件(record.txt)中的数据进行分割,并安装以下规则保存起来.  1.小甲鱼的对话单独保存为boy_*.txt的文件(去掉"小甲鱼:")  2.小客服的对话单独保存 ...

随机推荐

  1. 【目标检测大集合】R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记

    R-FCN.SSD.YOLO2.faster-rcnn和labelImg实验笔记 转自:https://ask.julyedu.com/question/7490 R-FCNpaper:https:/ ...

  2. 多线程中join方法的含义

    1.作用:调用这个方法的时候,主进程会在这里停住,等待该线程进行完毕再继续往下执行. 如:不使用join的情况: <?php class Join extends Thread { public ...

  3. 修改ranger ui的admin用户登录密码踩坑小记

    修改的ranger ui的admin用户登录密码时,需要在ranger的配置里把admin_password改成一样的,否则hdfs的namenode在使用admin时启动不起来,异常如下: Trac ...

  4. C#实现SQL数据库备份与恢复

    有两种方法,都是保存为.bak文件.一种是直接用Sql语句执行,另一种是通过引用SQL Server的SQLDMO组件来实现:  1.通过执行Sql语句来实现 注意,用Sql语句实现备份与还原操作时, ...

  5. js控制treeview默认展开

    bootStrapTreeview 在bootstrap的treeview官网,可以找到这个方法,用js控制可以写成:$('#xxx').treeview('collapseNode',{silent ...

  6. jieba文本分词,去除停用词,添加用户词

    import jieba from collections import Counter from wordcloud import WordCloud import matplotlib.pyplo ...

  7. 持续集成工具Jenkins安装、部署、使用

    本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...

  8. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

  9. 简易版jquery

    最近写了一个简易版的jquery   github地址:https://github.com/jiangzhenfei/Easy-Jquery 完成的方法: 1.$('#id') 2.extend扩展 ...

  10. 学习webpack

    前言 webpack前端工程中扮演的角色越来越重要,它也是前端工程化很重要的一环.本文将和大家一起按照项目流程学习使用wbepack,妈妈再也不用担心我不会使用webpack,哪里不会看哪里.这是一个 ...