面向对象

编程方式的区别

  • 过程式编程

  • 函数式编程

  • 面向对象式编程

面向对象编程

对象是类的一个实例

  • 创建
class foo():
def __init__(self): #类的构造方法
pass def doing(self): #类的其他自定义方法
pass
  • 实例化
    #根据我们创建的类来实例化一个对象
obj_foo = foo() #实例化了一个对象,所以称对象是类的一个实例化
  • 类的方法调用
 obj_foo.doing()
  • 构造方法__init__,会在对象创建的过程中被自动执行
class foo():
def __init__(self,name,age):
self.name = name
self.age = age def doing(self): #类的其他自定义方法
pass def speak(self):
print("My name is %s" %(self.name)) obj_foo = foo(“ Leon”,22) obj_foo.speak()
>>>My name is Leon
  • 析构方法 __del__会在当对象在内存中被释放时,自动触发执行

三大特性之-封装

  • 构造方法:__init__(self,*args,**kwargs)来接受类实例化过程的中封装传入的参数。构造完成后,每个类的实例都具有这样的的属性,属性的值确定要根据类的实例化过程传入的参数来确定
class foo(object):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex def talk(self):
print("My name is {name},{age} years old!".format(name=self.name,age=self.age)) def detail(self):
print(self.name)
print(self.age)
print(self.sex)
  1. 对象实例化,调用类对对象进行实例化,实例化完成后,传入以下参数,那么这个obj_1就会具有对应的属性
  2. 实例化过程中会自动执行对象的构造方法 __init__进行封装
obj_1 = foo("forsaken",22,"man")
  1. 对象实例化完成后,就可以调用被封装的内容
  2. 通过对象直接调用
print(obj_1.name)
print(obj_1.age)
print(obj_1.sex)
  1. 通过类中的方法使用self调用,此处为detail
  • 类中的几种属性

    • 私有属性
    • 公有属性
    • 成员属性
class Role(object): 

    #定义公有属性
international_organization = "WTO" def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
self.__heart = "healthy" #私有属性 def buy_gun(self, gun_name):
print(" %s has just bought % s" % (self.name, gun_name) )
#修改成员属性
self.weapon = gun_name def got_shot(self):
print("ohh... I got shot...")
self.__heart = "Died" #私有属性只能在内部使用
print(self.__heart) def shot(self):
print("%s is shooting.."%self.name) def get_heart(self):
return self.__heart

1.成员属性,即__init__方法中定义的属性

r1 = Role("Leon","FBI","ak-47")
print(r1.weapon) >>>ak-47 r1.buy_gun("ak-68") >>>Leon has just bought ak-68 print(r1.weapon) >>>ak-68

2.私有属性__private_attr_name = value 通过这种方式定义,只能在内部访问

r1 = Role("Leon","FBI","ak-47")
r1.got_shot() >>>ohh... I got shot...
>>>Died

2.1. 但是强制在外部访问的方式如下,但是不能更改,_类名__private_attr_name

print(r1._Role__heart)

2.2. 或者通过自己写的方法来return访问获取,如本例子中get_heart方法


print(r1.get_heart())

3.公有属性,需要在类中直接定义的属性即是公有属性,如本例中的international_organization

3.1. 属于本类的对象的实例都可以访问的属性称为公有属性

3.2. 实例化的两个对象都有这个international_organization属性

r2 = Role("Leon","police","shouqiang")

print(r1.international_organization)
>>>WTO
print(r2.international_organization)
>>>WTO

3.3. 程序运行,即使类没有实例化,该类的公有属性也被存放在了内存中,如下

print(Role.international_organization)
>>>WTO

3.4. 修改公有属性

3.4.1. 直接修改

Role.international_organization = "wwc"   #这样修改后类的实例都会更改

print(r1.international_organization)
>>>wwc
print(r2.international_organization)
>>>wwc

3.4.2. 通过实例修改,会在内存中的对象的对应地方创建一个international_organization字段来存新的值,而不会更改公有属性的值


r1.international_organization = "NBA" #修改r1的值,不会更改r2的,应为r2还是使用共有中定义的
print(r1.international_organization)
>>>NBA
print(r2.international_organization)
>>>wwc

备注

寻找当前类实例的共有变量,会首先寻找该实例内存中是否有,如果没有再去共有属性中寻找

通过实例修改r1.international_organization = "NBA",不会更改原有的公有属性,会在当前实例的队形内存中创建该变量,以便于下次使用

在内存中的解释为,即通过这种方式修改不会访问该变量的引用,而是修改了就会自己在保存一份

跟函数中的局部变量和全局变量的性质一样

4.类中的方法公有,只有一份共享

而类中的各种方法,都是共享的,实例化后不会重新创建某个方法

如果非要将方法私有化,可以使用下面的方法

将shut方法变成私有的方法

def shou4(self):
print("run shot in my own method",self.name) r1.shot = shou4
r1.shot(r1)
r2.shot()

三大特性之-继承

class f1(object):

    def show(self):
print("show") class f2(f1): def bar(self):
print("bar")
  1. f2中并没有show方法,但是当 f2(f1)写了以后,就代表f2继承f1的方法,f1为f2的父类,f2为f1的子类

  2. 创建子类对象,但是可以执行父类f1中的方法

_obj_f2 = f2()
_obj_f2.show()
  1. python中的类可以有很多个父类

静态方法-类方法-属性方法


class Person(object): name = "Rain" def __init__(self,name):
self.name = name
self.__mes = None @staticmethod
def eat(name,food): #静态方法即不能访问公有属性,也不能访问实例,只是相当于一个单纯的函数,跟类没有什么关系,但是需要类名来调用
#不能使用实例的属性
#不需要self
#类似于台湾 中国台湾
#类似于该类的一个工具包
print("%s is eating..%s." % (name,food)) @classmethod
def walk(self): #类方法 只能访问类的公有属性, 不能访问实例属性
#类方法可以用于类中的公有属性与成员变量相同时,强制访问公有属性
print("%s is walking..."%self.name) #此时的name仍然是公有属性的值 @property #属性方法, 的作用是把一个方法变成一个静态属性
def talk(self):
#使用@property后,该方法变成一个静态属性,不能加括号进行调用,如果调用会NoneType xception
print("%s says " %(self.name)) @talk.setter #通过这种方式为这个静态属性赋值,就可以传入参数
def talk(self, msg):
print("old msg:", self.__mes)
self.__mes = msg #这样就实现了修改
print("set msg:", msg)
print("set msg:", self.__mes) @talk.deleter #正常类的属性,实例的实行可以被删除
#那么使用这样的方式来删除属性方法
def talk(self):
del self.__mes #删除了就不能再使用了
print("delet talk...") p1 = Person("leon")
p1.talk #>>leon says p1.talk = "set static attr" #调用talk来实现talk的静态属性赋值 del p1.talk

类的特殊成员方法

1.__module____class__

class C:

    def __init__(self):
self.name = 'wupeiqi'
from lib import C

obj = C()

print(obj.__module__)
# 输出 lib即:输出模块
print(obj.__class__)
#<class 'lib.C'>

2.__call__ 对象后面加括号,触发执行,区别于__init__

  • 构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
def __init__(self):
pass def __call__(self, *args, **kwargs):
print
'__call__' obj = Foo() # 执行 __init__
obj() # 执行 __call__

3.__dict__ 查看类或对象中的所有成员

class Province:
country = 'China' def __init__(self, name, count):
self.name = name
self.count = count def func(self, *args, **kwargs):
print('func') # 获取类的成员,即:公有属性、方法
print(Province.__dict__)
#获取 对象obj1 的成员属性
obj1 = Province('HeBei',10000)
print(obj1.__dict__)

4.__str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值

class Foo:
# def __str__(self):
# return 'Leon'
pass obj = Foo()
print(obj) #如果不定义__str__方法,那么返回该对象的内存地址<__main__.Foo object at 0x10d2c6dd8>

5.__getitem____setitem____delitem__用于索引操作,如字典。分别表示获取、设置、删除数据

class Foo(object):
def __getitem__(self, key):
print('__getitem__', key) def __setitem__(self, key, value):
print('__setitem__', key, value) def __delitem__(self, key):
print('__delitem__', key) obj = Foo()
result = obj['k1'] # 自动触发执行 __getitem__
obj['k2'] = 'alex' # 自动触发执行 __setitem__
del obj['k1']

6.__init____del__ 被称为构造方法析构方法

class SchoolMember(object):

    member = 0
def __init__(self,name,age,sex): #构造方法在实例化的过程中运行
self.name = name
self.age = age
self.sex = sex def __del__(self): #析构函数会在程序完成后吧每个对象的实例都删除
print("把[%s]开除了"%self.name)
SchoolMember.member -= 1

python学习-面向对象的更多相关文章

  1. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  2. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  3. Python学习---面向对象的学习[深入]

    类的深入学习    a. Python中一切事物都是对象     b. class Foo:             pass                obj = Foo()         # ...

  4. python学习------面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  5. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

  6. python学习 面向对象高级编程

    ---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...

  7. python 学习 面向对象编程

    面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...

  8. python学习——面向对象的三大特性

    一.继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 1.python中类的继承分为:单继承和多继承 class P ...

  9. python学习-面向对象(六)

    1.类中的实例方法 self参数最大的作用是引用当前方法的调用者 类调用实例方法,python不会位为一个参数绑定调用者(因为实例方法的调用者应该是对象,而此时是类) 2.类方法与静态方法

随机推荐

  1. Ubuntu16.04安装opencv for python/c++

    Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...

  2. Angular简易分页设计(二):封装成指令

    (首先声明本文来自博客园本人原创,转载请说明出处.欢迎关注:http://www.cnblogs.com/mazhaokeng/) 之前我们讲过,Angular分页代码确实不难实现,但是由于在多个路由 ...

  3. myeclipse/eclipse 配置SSM框架错误之一解决方法

    报错如下: 1. [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initializatio ...

  4. python特征提取——pyAudioAnalysis工具包

    作者:桂. 时间:2017-05-04  18:31:09 链接:http://www.cnblogs.com/xingshansi/p/6806637.html 前言 语音识别等应用离不开音频特征的 ...

  5. Spring Cloud构建微服务架构(一)服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  6. hdu1213 How Many Tables 并查集的简单应用

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 简单的并查集 代码: #include<iostream> #include< ...

  7. Android Studio 首坑 Gradle sync failed: Cause: error in opening zip file 的错误

    前言 今天安装Android studio 2.3.1时发生了一个错误,安装完成后创建第一个Hello World项目是报错.经过这个百度后,结果没有一个靠谱的.将拆解经过记录一下. 环境: 操作系统 ...

  8. 自坑实录 - Asp.net MVC中无法使用@Ajax.BeginForm问题解决

    创建空的web项目,通过Nuget引用mvc组件来搭建空的MVC项目时, 在视图页面中无法使用@Ajax.BegForm来进行异步提交数据, 而新建默认的MVC模板项目却能够正常使用@Ajax.Beg ...

  9. java中一个重要思想:面向对象

    面向对象: 1, 面向过程的思想(合适的方法出现在合适的类里面) 准备去一个地方: 先买车, 挂牌, 开导航, 踩油门, 过黄河, 穿越珠穆朗玛峰... 2, 面向对象的思想 我开着车去, 车怎么去随 ...

  10. python selenium 环境搭建(一)

    elenium 虽然过了这么多年,但是到目前为止依然是比较流行的自动化框架了,还有很多的初学者在学习,所以根据自己的时间将把相关的资料汇总一下,下面首先我们需要搭建一下基础环境. 首先自己本身比较笨, ...