设为首页 收藏本站
查看: 767|回复: 0

[经验分享] python之面向对象简要剖析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-8 09:26:37 | 显示全部楼层 |阅读模式
__author__ = '李晓波'

Python面向对象简要剖析
如要下载附件阅读请将后缀改为.py,请使用"notepad++"打开此文档,"alt+0"将函数折叠后方便查阅

在python中一切皆为对象。面向对象编程的理论知识其实很好理解,说白了就是一堆名词,
把其中每个名词代表的含义,和他们之间的关系,面向对象就迎刃而解了。
python面向对象编程的基本名词:类、对象、方法、属性。
类和对象的关系:类是对象的抽象化,对象是类的实例化。类不代表具体的事物,而对象表示具体的事物。
直观的说:坏人指的是一类人,是一部分人的一个集合。那么你是一个坏人,因为你具备坏人的一些特性,
其中坏人就是一个类,你就是类中的的一个对象。但实际编程中类不是那么太好划分,还需你多多使用。
类和对象定义的变量叫属性(attribute):
其中类定义的叫类属性,对象定义的叫对象属性
类里的函数叫做方法(method):是对象的动作
结论:对象=属性+方法
类的常见使用场景,把具有相同属性和方法的对象归为一个类(class):
所以类经常用在:1、多个方法共用同样的变量,2、动态创建具有相同属性的对象。
类的三大特性:
多态:多态意味着可以对不同的对象使用同样的操作,但它们可能会以多种形态呈现出结果。
继承:面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制,
可先简单的理解为子类继承父类。
封装:类把所需要的属性和方法,封装在类中,其带来的好处有多个方法可以共用一组变量,
通过一个模板就可以创建多个对象。
类的成员:
字段(属性):静态字段,动态字段
方法:动态方法(类里函数),静态方法,类方法
属性:一种为类和对象的变量,另一种为方法加装饰器前提类必须是新式类,
1、@property 2、@方法名.setter  3、@方法名.deleter,访问时以字段形式(所以也称它为属性,自己的理解)
类成员修饰符:
在属性或方法前面加__(两个横杠),属性和方法就变为私有的,不可以被直接访问了。
引用某大神的图片,可更直观理解面向对象。其中个别名词不太一样,不要纠结,一个叫法而已

wKioL1ZlAkuBqxnfAAa9LgjewOw321.jpg
下面的例子都做了相应的注释大家可以自己写写看看运行的结果。
class person(object): #类的格式
    beipiao = '北漂一族' #静态字段:属于类的变量叫做静态字段属于类。
    #__init__函数为构造函数,用于初始化动态字段即初始化对象变量
    def __init__(self, name,age,addr): #其中self为对象本身,后面的参数为类在实例化传入的参数
        #动态字段:属于对象的变量叫做动态字段属于对象
        self.name = name #动态字段
        self.age = age
        self.addr = addr
        self.__papapa = True #私有字段 ,不能被外部直接访问
        print '(%s: %s)' % (person.beipiao,self.name)
    def __del__(self): #析构函数:当对象不再被使用时, __del__ 方法运行
        print('最后的话')
    def sayHi(self): #类中函数称为动态方法
        print 'Hi, my name is %s.' % self.name
    @staticmethod #将动态方法转换为静态方法,不用实例化类,直接用类调用静态方法
    def chinese(): #不用加self参数,可加其他参数
        print('我们都是中国人')
    @classmethod
    def class_met(cls): #类方法:用类调用,参数只能是cls
        print('class    method')
    def info(self):
        print('name:%s  age:%s  address:%s'%(self.name,self.age,self.addr))
    @property #属性:通过装饰器把方法转换成属性:常用作返回值,直接用对象调用方法不用加()
    def car(self):
        print ('买不起车')
    def __me(self): #私有方法
        print('没钱没房没车')
    @property #只读
    def papapa(self):
        return self.__papapa
    @papapa.setter #可写
    def papapa(self,value):
        self.__papapa=value
    @papapa.deleter
    def papapa(self,value): #删除值
        self.__papapa=value
结果展示
lxb = person('小波',23,'河北') #创建对象,就是类的实例化,同时声明变量。
print(lxb.beipiao)# 对象能访问静态字段#print(person.name)#类不能访问动态字段
person.chinese() #类的静态方法
print(lxb.papapa()) #私有字段通过内部公有方法方法展示
print lxb.car #用字段形式访问特性
lxb._person__me() #直接访问私有方法不建议使用
person.chinese() #用类调用静态方法
person.class_met() #用类调用类方法
print lxb.papapa #修改私有字段前结果
lxb.papapa=False #修改私有字段
print(lxb.papapa) #修改私有字段之前的结果


class poor(person):#类的继承
    def __init__(self,name,age,addr,buy): #子类增加类变量buy
        super(poor,self).__init__(name,age,addr)#调用父类的构造函数,经典类调用方法
        person.__init__(self, name,age,addr)#调用父类的构造函数
        self.buy=buy
    def sayHi(self):
        print('%s is a poor')%self.name
结果展示
lxb=poor('小波',23,'河北','cannot')
lxb.car #子类中不存在的方法直接调用,将继承父类的方法
lxb.sayHi() #子类中重新定义的方法,将使用自己的方法


经典类深度优先继承,新式类为广度优先
满足条件,四个类a,b,c,d,其中a为(bc)的基类 ,(bc)继承a ,d继承b,c
class a(): #a不继承任何类为经典类,继承object为新式类。
    def f1(self):
        print('a.f1')
class b(a):
    def f2(self):
        print('b.f1')
class c(a):
    def f1(self):
        print('c.f1')
class d(b,c):
    def f2(self):
        print('d.f1')
d().f1() 经典类结果为a.f1 #当a类继承object,结果为c.f1


类的特殊方法:
1、__doc__表示类的描述信息
class Foo:
""" 描述类信息,这是用于看片的神奇 """

def func(self):
pass

print Foo.__doc__
2、__module__ 和  __class__ :
__module__ 表示当前操作的对象在那个模块,__class__ 表示当前操作的对象的类是什么
3、__call__
对象后面加括号,触发执行。
4、__dict__
类或对象中的所有成员
5、__str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-148271-1-1.html 上篇帖子: python找出列表重复值 下篇帖子: Python的数据类型 字符串和编码 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表