Python学习笔记008_类_对象_继承_组合_类相关的BIF
# 对象 = 属性 + 方法
>>> # Python中的类名约定以大写字母开始
>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它是不需要的
>>>
>>> # Python中的self就相当于Java中的this
>>> # self ,一般都放在方法的第一个参数中这是默认的要求
class Ball: def setName(self,name): self.name=name def kick(self): print("我叫%s,谁踢我,找死啊..." %self.name) a = Ball() # 不需要用new关键字,注意和其它语言的区别 a.setName("阿黄") b = Ball() b.setName("黄红义") a.kick() 我叫阿黄,谁踢我,找死啊... b.kick() 我叫黄红义,谁踢我,找死啊...
>>>
>>> # Python的魔法方法,它是被Python在特殊的时候自动调用的
>>> # 这些魔法方法有一个特点,就是被双下划线包围
>>> # 比如 __init__(self)
>>> # __init__(self,param1,param2,...) ,是构造方法,实例化对象时自动被调用
>>>
class Ball: def __init__(self,name): self.name = name def kick(self): print("我叫%s,谁踢我,找死啊..." %self.name) b = Ball('土豆') b.kick() 我叫土豆,谁踢我,找死啊...
>>>
>>># 在Python中定义私有变量或者函数,只需要在名字前加两个下划线"__"
>>> class Person: __name = '猪八戒' >>> p = Person() >>> p.__name Traceback (most recent call last): File "<pyshell#45>", line 1, in <module> p.__name AttributeError: 'Person' object has no attribute '__name'
>>>
>>># 实际上,Python是将 __开头的私有属性和方法的名称改编成了 _类名__变量名
>>> # 从这一点可以看出,Python的私有化是伪私有
>>> class Person: __name = '猪八戒' def getName(self): return self.__name >>> p = Person() >>> p.getName() '猪八戒' >>> >>> p._Person__name '猪八戒'
>>> # 继承语法 class DerivedClassName(BaseClassName):
>>> # ......
>>> # 子类可以继承父类的所有方法和属性
>>> # 如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性
>>>
>>>
>>> import random as r >>> >>> class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) def move(self): self.x -= 1 print("我的位置:",self.x,self.y) >>> >>> class Shark(Fish): def __init__(self): self.hungry = True def eat(self): if self.hungry: print('吃货的日子就是这个样子^_^') self.hungry = False else : print('吃撑了')
>>> fish = Fish()
>>> fish.move()
我的位置: 6 3
>>> shark = Shark()
>>> shark.move()
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
shark.move()
File "<pyshell#52>", line 6, in move
self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'
# 因为__init__方法被重写,所以没有了 x属性
# 解决上面的方式有两种方式 >>> # 1, 调用未绑定的父类方法 >>> # 2, 使用super函数 (推荐使用) class Shark(Fish): def __init__(self): Fish.__init__(self) # 调用未绑定的父类方法 self.hungry = True def eat(self): if self.hungry: print('吃货的日子就是这个样子^_^') >>> shark = Shark() >>> shark.move() 我的位置: 3 2
>>> class Shark(Fish): def __init__(self): super.__init__() # super(),它不用传递self参数 self.hungry = True def eat(self): if self.hungry: print('吃货的日子就是这个样子^_^')
>>> # 支持多继承
>>> class class DerivedClassName(base1,base2,base3...):
>>>
>>> # 组合: 就是把类实例化,放到一个新类里面
>>>
>>> # 举例子说明:现在要定义一个类,叫水池,水池里面要有乌龟和鱼
>>>
>>> >>> class Turtle: def __init__(self,x): self.num = x >>> class Fish: def __init__(self,x): self.num = x >>> class Pool: def __init__(self,x,y): self.turtle = Turtle(x) self.fish = Fish(y) def print_num(self): print("水池中有%d只乌龟,%d条鱼" %(self.turtle.num,self.fish.num)) >>> >>> pool = Pool(2,3) >>> pool.print_num() 水池中有2只乌龟,3条鱼 >>>
>>>
>>> # 类中定义的属性都是静态属性
>>> # 类属性和类对象是相互绑定的,并不依赖于实例对象
>>>
>>> # 如果属性名和方法名相同,属性会覆盖方法
>>>
>>> #绑定? Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念
>>>
>>> # 大多时候我们使用的都是实例属性,只有在跟踪类的某些状态时候才使用类属性
>>>
>>>
>>> # 类相关的一些BIF函数
>>> #issubclass(Class,classinfo), 如果Class是classinfo的子类,返回True,否则返回False
>>> # 一个类被认为是其自身的子类
>>> # classinfo可以是类对象组成的元祖,只要class是其中任何一个候选类的子类,返回True
>>>
>>> # object是所有类的基类
>>>
>>> class A: pass >>> class B(A): pass >>> issubclass(B,A) True >>> issubclass(B,B) True >>> issubclass(B,object) True >>>
# isinstance(object,classinfo) , 实例对象是否属于类的实例对象
>>>
>>> # 如果第一个参数不是对象,则永远返回False
>>> # 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个TypeError异常
>>>
>>> b = B() >>> isinstance(b,B) True >>> isinstance(b,A) True
>>> # 几个与属性attr 相关的BIF
>>>
>>> # hasattr(object,name) # 对象是否拥有某个属性
>>> class C: def __init__(self,x=0): self.x = x >>> c1 = C() >>> hasattr(c1,"x") True
>>> # getattr(object,name[,default]) ,获取对象指定的属性值,如果属性不存在,打印default指定的值
>>> getattr(c1,"y","你访问的属性不存在...") '你访问的属性不存在...' >>>
>>> # setattr(object,name,value), 设置对象的属性值,如果属性不存在,则新建这个属性并且设置为value指定的值
>>> setattr(c1,'y','yangw') >>> getattr(c1,'y',"你访问的属性不存在...") 'yangw' >>>
>>>
>>> # delattr(object,name) ,删除对象的属性,如果属性不存在则抛出异常
>>> delattr(c1,'y') >>> delattr(c1,'y') Traceback (most recent call last): File "<pyshell#106>", line 1, in <module> delattr(c1,'y') AttributeError: y >>>
>>>
>>> #*********这个属性是很有用的 ********
>>> property(fget=None,fset=None,fdel=None,doc=None) ,它是通过属性设置属性
>>># 第一个参数是 获取属性的方法,第二个参数是设置属性的方法,第三个参数是删除属性的方法
>> class C: def __init__(self,size = 10): self.size = size def getSize(self): return self.size def setSize(self,value): self.size = value def delSize(self): del self.size x = property(getSize,setSize,delSize) >>> c = C() >>> # 这时我们可以利用x来设置size的值 >>> c.x=20 # 会调用 setSize方法 >>> c.getSize() 20 >>> c.size # 会调用 getSize方法 20 >>> del c.x #会调用 delSize方法 >>> c.size # 属性已删除,再执行就会抛出异常 Traceback (most recent call last): File "<pyshell#136>", line 1, in <module> c.size AttributeError: 'C' object has no attribute 'size' >>>
Python学习笔记008_类_对象_继承_组合_类相关的BIF的更多相关文章
- python学习之路---day20--面向对象--多继承和super() 函数
一:python多继承 python多继承中,当一个类继承了多个父类时候,这个类拥有多个父类的所欲非私有的属性 l例子: class A: pass class B(A): pass class C( ...
- Python学习笔记之—— File(文件) 对象常用函数
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...
- python学习笔记:第20天 多继承、MRO C3算法
目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...
- python学习笔记(二十四)继承与封装
继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...
- Python学习笔记7:函数对象及函数对象作參数
一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给 ...
- Python学习笔记(1)对象类型
强制转换字符串函数str 如果我们求2的一百万次方是多少那么我们可以 print(2**1000000) 如果我们要求2的一百万次方有多少位那么我们可以用str函数强制转换成字符串然后len函数计算 ...
- Python学习笔记_我的参考网址
Python学习笔记, 下面记录网上搜到的可参考的网址: 一.关于Tkinter 1.Python3中tkinter模块使用方法详解 https://blog.csdn.net/Fighting_Bo ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- Python学习笔记_Python对象
Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...
随机推荐
- JavaScript基础-流程控制-if
流程控制基本概念 默认情况下,程序的运行流程是这样的:运行程序后,系统会按书写从上至下顺序执行程序中的每一行代码,但是这并不能满足我们所有的开发需求 1.png 实际开发中, 我们需要根据不同的条件执 ...
- collection 模块
关于一些 特殊数据类型的模块 namedtuple顾名思义,一个带有名字的元祖,他也是跟对象有关的一个 from collections import namedtuple phone = named ...
- Java并发基础——Thread
并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...
- 从基于idea的第一个javaweb项目到shell脚本项目自动发布(jdk1.8,mysql5.7,maven3.5,tomcat9,subversion,centos7.3)之一
首先说一下为什么写这篇文章,因为从正式参加工作就做javaweb开发,一路走来,碰到了很多的问题,每次问题都想从度娘那里得到准确的答案,但是,每个人遇到的问题不尽相同,问题的解决方案有时候也只是仅供参 ...
- Python获取秒级时间戳与毫秒级时间戳
获取秒级时间戳与毫秒级时间戳 import time import datetime t = time.time() print (t) #原始时间数据 print (int(t)) #秒级时间戳 p ...
- C# 实现模拟登录功能,实现公共类分享。
前言 最近在研究模拟登录的各种方法, 主要想要实现的两个功能是: 1.点击按钮可以直接跳转并登录到某一个系统中. 2.抓取某一个系统中某一个页面中的特定数据. 为此在网上查了许多的资料,首先了解到自身 ...
- jsp 使用Common-FileUpload组件文件上传及限制上传类型
1.将commons-fileupload-1.3.3.jar复制到Web应用的lib文件夹下,在WebRoot目录下创建limit.jsp页面,在该页面中添加一个文件域的表单,设置类型为 mu ...
- 扩展Python模块系列(五)----异常和错误处理
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...
- this和super的运用
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...
- 表单校验demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...