Python小知识点(5)--面向对象部分
面向对象:
世间万物,皆可分类。--------------------手机《--------------某一个分类
世间万物,皆为对象。--------------------我的手机《---------有具体指向
只要是对象,就肯定属于某种品类。
只要是对象,就肯定有属性。
类的相同点一起写,不同点分开写。
1.Python类中self的来源:
通常函数的执行方式为:
调用函数--》执行函数----》返回该函数的执行结果(得到一个内存地址)
Python类中方法却不是这样执行的,
而是在实例化对象的同时也将此时的对象名称传入。然后在类中__init__需要一个参数接受该对象,故选用self,self代表的是当前对象的引用,指向的是同一块内存地址,所以不需要使用return返回值。
2.为什么类中的方法最少有一个self参数?
这是由于类中的方法是类内部共存(共享)的,不像其他字段属性每次都在内存中复制得有,但是得知道每次调用该方法的对象是谁,需要将调用这个方法的对象传递到该方法中,故需要一个self接收该对象。在底层是通过----》类.方法(对象名)实现该过程的。最终的实现是谁调用这个方法,谁就把自己传递给该方法。 类名.方法名(类的对象)
r=Role(‘WFB’) Role是一个类,类中有一个got_shot()方法。
r.got_shot()======》实质为Role.got_shot(r)
3.在构造函数中初始化:在内存中开辟一块空间,然后将一些值进行存储。对于没有在构造函数中初始化的方法是在类的内存当中的,而不是在实例的内存空间里。
4.python 类变量和实例变量
类变量既可以通过实例也可以通过类来访问,这是因为访问顺序是默认先访问实例的,若实例中没有则来访问类的。
实例变量是可以增加的,也是可以删除的,体现为:
4.1增加
4.1.1 在类初始化时是通过构造函数__init__()中接收的self参数然后进行赋值,如下
class Role: def __init__(self, name): #在实例化时做一些类的初始化的工作 self.name = name #实质为r1.name=name实例变量(静态属性),作用域就是实例本身
实质为:
r=Role(“wfb”)===>r=Role(r,”wfb”) ,然后通过r.name=name在构造函数中进行赋值。
4.1.2 在类实例后单独增加,现在新增一个实例变量范围只针对该实例。
例如:
r=Role("wfb")
r.gender="男"
上述两者实质是一样的,只是赋值时间有区别,一个是在类在实例化(调用构造函数)时赋值。一个是在实例化之后再在赋值操作。同样可以达到为某实例增加属性的目的。
4.2删除
删除实例变量(只是针对当前的对象)。
方式为=>
del r.name
这样该实例就没有了该变量,但是不会影响其他的实例变量。
5.在实例中是否可以改类中的类变量??
class Role:
n=”我是类变量”
def __init__(self, name):
#在实例化时做一些类的初始化的工作
self.name = name #实质为r1.name=name实例变量(静态属性),作用域就是实例本身 r1=Role(“wfb”)
r1.n=”我是修改后变量”
Print(“r.n===%s”%r.n) #=====>输出我是修改后变量 r2=Role(“WFB Nice”)
Print(“r2.n===%s”%r2.n) #======>输出为我是类类变量。
#先在实例中查找是否有n,没有则去查找类中是否有。
总结:通过试验可以知道 我们通过实例修改类中同名的变量,实质为是在该实例的内存中新增了一个与类变量同名的实例变量。其他实例来调用该类中的类变量时,其中类变量的值是没有发生变化的。
6.通过类是否可以直接修改类的的类变量??【类名.类变量==值】、
结论为:若实例中已有新增的与类变量同名的则变量值为实例中的变量值,否则则是修改后的类变量值,这是由于访问顺序是默认先访问实例的,若实例中没有则来访问类的。
需要注意的是若变量是一个list则修改一个影响全部,这是由于他们共用的是同一个内存地址。
实例变量是为了区别每个对象的不同点,而类变量是该类所用实例对象共用的。当某个对象实例中关于这个类变量需要不同值,可以为该对象实例新增一个与类变量同名的实例变量。
7.私有属性、私有方法=====》体现了封装
格式为:
私有属性:__attr
私有方法:def __way(self): pass
特性:只能是在改类中访问,若外部需要私有属性或者方法,解决方法为在该类的内部定义一个可供外部访问的方法,然后在该方法中调用私有属性或方法。
8.继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
继承概念的实现方式主要有2类:实现继承、接口继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力。
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构父类方法)。
8.1 类的继承
8.1.1 继承的定义
class Person(object): # 定义一个父类 def talk(self): # 父类中的方法
print("person is talking....") class Chinese(Person): # 定义一个子类, 继承Person类 def walk(self): # 在子类中定义其自身的方法
print('is walking...') c = Chinese()
c.talk() # 调用继承的Person类的方法
c.walk() # 调用本身的方法 # 输出 person is talking....
is walking...
8.1.2 构造函数的继承
如果我们要给实例 c 传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?
继承类的构造方法:
1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
2. 新式类的写法:super(子类,self).__init__(参数1,参数2,....)
class Person(object): def __init__(self, name, age):
self.name = name
self.age = age def talk(self):
print("person is talking....") class Chinese(Person): def __init__(self, name, age, language): # 先继承,在重构
Person.__init__(self, name, age) #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
self.language = language # 定义类的本身属性 def walk(self):
print('is walking...') class American(Person):
pass c = Chinese('wfb', 22, 'Chinese')
总结:假如只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。
子类构造函数基础父类构造函数过程如下:
实例化对象c ----> c 调用子类__init__() ---- > 子类__init__()继承父类__init__() ----- > 调用父类 __init__()
8.1.3 对父类方法的继承
如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法。
class Person(object): def __init__(self, name, age):
self.name = name
self.age = age def talk(self):
print("person is talking....") class Chinese(Person): def __init__(self, name, age, language):
Person.__init__(self, name, age)
self.language = language
print(self.name, self.age, self.language) def talk(self): # 子类 重构方法
print('%s is speaking chinese' % self.name) def walk(self):
print('is walking...') c = Chinese('wfb', 22, 'Chinese')
c.talk() # 输出
wfb is speaking chinese
关于多继承是按照从左到右【代码中提现方式】继承的,在继承上存在一个先后关系,其中构造函数只会继承一个(从从左到右谁先有就继承谁的)。
例如:
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print("B") class C(A):
def __init__(self):
print("C") class D(B, C):
pass d = D()
# 结果输出的为B
特别的:
9. 多态:一个接口多种实现。 作用:接口重用。
学习git为 https://gitee.com/FelixBinCloud/PythonLearn/tree/master/PythonLearn
Python小知识点(5)--面向对象部分的更多相关文章
- python小知识点总结
小知识点总结 1.python2和python3的区别 python2 python3 默认编码 ascii utf-8 input() raw_input() input() print 可以不 ...
- Python小知识点(3)--装饰器
(1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): star ...
- python小知识点
问题:求列表中每个元素的元素次方之和>>> a=[1,2,3,4]>>> k=len(a)第一种解法# s=0# for x in a:# ...
- python小知识点随笔
可能会有不局限于Python语言的内容,文中“>>>”表示结果,而不是命令行交互的提示符 1.关于字符串编码 ASCII编码 占用一个字节 二进制11111111=十进制255 所以 ...
- Python 小知识点(7)--类的创建方式
1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...
- Python小知识点(4)--模块相关
1.模块: 定义:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test). 包:用来从逻辑上组 ...
- Python小知识点(2)
1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...
- Python 小知识点(1)
1.Python命名规则------>下划线连接 girl_of_wfb="lgl" 2.常量-----名称全大写->WFB="WFaceBoss&qu ...
- Python小知识点+保留字
注意 !/usr/bin/python # -- coding: UTF-8 -- #中文编码 Python空行:函数之间或类的方法之间用空行分隔,表示一段新的代码的开始 Python注释:单行注释采 ...
随机推荐
- Windows 上安装 Azure PowerShell及Azure PowerShell部署虚拟机
一.Azure PowerShell部署 1.使用 PowerShellGet 在 Windows 上安装 Azure PowerShell 从 Azure PowerShell 版本 6.0 开 ...
- 闲记 单元格与单元格之间的边 ///字体属性都是font开头,除了颜色属性 ///文本属性都是text开的,除了设置行高。
这两天一直在做网页没有什么太大的问题,期间也考了一场试,对答案的时候老师讲了一些小知识,因此来记录一下. 单元格与单元格之间的边距(cellspaling) list-type-image可以使用图像 ...
- Git 几个常用操作
git init -- 初始化仓库, git clone -- 从远端克隆仓库到本地 git status -- 查看git仓库的状态 git log ...
- 解决MOFH免费空间cpanel面板大文件无法解压的情况
解决办法: 解压大文件,重新压缩为tar格式的压缩格式,这样可以更小,而且也可以在cpanel面板解压,记得使用filezilla软件上传文件,在cpanel的网页界面不要刷新,一刷新就不可以解压大文 ...
- Cocostudio 1.4 实现的Demo程序源码
开发环境是CocoStudio 1.4 + Cocos2dx 2.2.3 把项目文件放到Cocos2dx下的projects文件夹下就可以执行了 压缩包里面包括了 源码 和资源文件 1.DemoSh ...
- CentOS7下安装Python3并保留Python2
1. 安装make编译指令的依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel ...
- 7_CentOS下安装和卸载AdobeReader
曾经最喜欢Fedora 版本的Linux,但是因为现在Fedora的界面实在太花里胡哨了,所以最近开始捣鼓CenOS,本来 RedHat的EL版本也是一个不错的选择,最后想想还是用社区版的. 话说Ce ...
- URLConnection(互联网)
一.urlconnection连接Servlet 1:> URL请求的类别: 分为二类,GET与POST请求.二者的区别在于: ...
- 在linux中输出每个group的用户成员
先提供使用文件一步一步获取相关信息: 1. 获取所有的用户: awk -F: '{print $1 > "1.txt"}' /etc/passwd 2. 获取每个用户, 及其 ...
- python之路——24
复习 1.面向对象编程 思想:角色的抽象,创建类,实例化,操作实例2.面向对象的关键字 1.类的静态属性,存储在类的命名空间 2.类名.方法(对象),对象.方法 3.对象可以使用静态变量:类不可以使用 ...