zoukankan      html  css  js  c++  java
  • 面向对象,类

    #-*- coding:utf-8 -*-
    class Dog(object):
        a=123              #类变量
        def __init__(self,name):            #此为构造函数 ,实例化时自动执行执行此方法,做初始化工作
            self.name=name  #实例变量
            print self.name
            a=333
            print a
        def bulk(self):
            print ('%s wang wang')%self.name
        def __del__(self):                          #此为析构函数,在程序执行完毕,自动执行析构函数
            print ('执行完毕,实例狗狗被销毁')
        print a
    D1=Dog('HAHA')
    D2=Dog('huahua')
    
    D1.bulk()
    D2.bulk()
    print Dog
    print D1
    print D2
    

    以上这个程序,先解析此程序,把类,类内部的init和bulk方法进行解析,存入内存中,
    然后执行D1=Dog('HAHA'),就是实例化D1,把实例参数传入init方法中,自动执行此方法,
    也就是说,实例化时,init函数是自动触发执行的,执行完,后执行D2=Dog('huahua'),
    然后再执行init,接着执行D1.bulk(),调用bulk方法,然后是D2.bulk(),再调用bulk

    class people(object):      #基类
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def eat(self):
            print (('一个叫%s的%s性%s岁的人在吃饭') % (self.name, self.sex, self.age))
        def sleep(self):
            print (('一个叫%s的%s性%s岁的人在睡觉') % (self.name, self.sex, self.age))
    
    class man(people):           #子类
        def yan(self):          #子类会继承父类的所以属性和方法,子类在父类基础上进行方法yan扩充,
            print (('一个叫%s的%s性%s岁的人在吸烟') % (self.name, self.sex, self.age))
    def sleep(self): #子类可以重构父类里面的方法,此对父类的sleep方法进行了扩充 people.sleep(self) print ('每晚都会打呼噜') class woman(people): #子类 def __init__(self,name,age,sex,shop): #子类可以增加参数,在继承父类的构造方法后,对其进行扩充 super(woman,self).__init__(name,age,sex) self.shop=shop def shopping(self): print (('一个叫%s的%s性%s岁的人在%s') % (self.name, self.sex, self.age,self.shop)) peo1=people('chenna',24,'女') peo1.sleep() man1=man('xiaoming',22,'男') man1.piao() man1.sleep() woman1=woman('chenna',24,'女','买菜') woman1.shopping()
    class p1(object):
        def foo(self):
            print 'in the p1-foo'
    
    class p2(object):
        def foo(self):
            print 'in the p2-foo'
        def bar(self):
            print 'in the p2-bar'
    
    class c1(p1,p2):
        pass
    
    class c2(p1,p2):
        def bar(self):
            print 'in the c2-bar'
    
    class gc (c1,c2):
        pass
    
    gcc=gc()
    gcc.foo()
    gcc.bar()
    print gc.__mro__  #显示查找顺序
    #新式类采用从左到右的广度优先查找,
    

     旧式类采用深度优先的算法查找,

    旧式类采用广度优先的算法查找,

     三种重要方法:静态方法,类方法,属性方法

    class Dog(object):
        def __init__(self,name):
            self.name= name
        @staticmethod          #吧类里面定义的动态方法eat变成了静态方法,切断了eat方法和类之间的联系,类无法自动给方法传参
        def eat(self,food):
            print ('%s is eating %s'%(self.name,food))
    
    d=Dog('HAHA')
    #d.eat('骨头')
    #TypeError: eat() takes exactly 2 arguments (1 given),
    # 也就是此时,类没有自动给调用的方法eat传递self的参数(即没d传给eat的self)
    
    d.eat(d,'骨头')#这里手动吧参数传了进去
    '''
    '''
    class Dog(object):
        n=333
        def __init__(self,name):
            self.name=name
            self.n=222
        @classmethod    #通过此装饰,使类里面的方法eat变成类方法
        def eat(cls):
            print ('%s is eating %s'%(cls.n,'dd'))
    d=Dog('haha')
    d.eat()
    #类方法:只能访问类变量,不能访问实例变量,变成类方法后,self被cls代替,一定要注意书写
    
    
    class Dog (object):
        def __init__(self,name):
            self.name=name
        @property
        def eat(self,food):
            print ('%s is eating %s'%(self.name,food))
    d=Dog('haha')
    d.eat('gutou')
    #TypeError: eat() takes exactly 2 arguments (1 given),类没有自动把self的值传给eat方法
    属性方法:通过@property,把一个类里面的方法eat变成了属性方法,就是把它变成了静态属性,
    所以不能通过加()来调用,这样的话就带来了一个问题:如何在调用此方法,给它传参数。
    
    class Dog (object):
        def __init__(self,name):
            self.name=name
        @property
        def eat(self):
            print ('%s is eating %s'%(self.name,self.__food))
    
        @eat.setter
        def eat(self,food):
            print ('set to food :',food)
            self.__food =food
        @eat.deleter
        def eat (self):
            del self.__food   
    
    d=Dog('haha')
    d.eat
    上部分代码出错???????????????
    

    反射:hasattr,getattr,setattr,delattr四个函数
    hasattr(obj,name_str):判断一个对象obj里面是否有对应得name_str字符串,(返回T,F)
    getattr(obj,name_str):根据字符串去获取obj对象里面的对应得方法的内存地址
    setattr(obj,nama_str,value),setattr()将要么加入一个属性,要么取代一个已经存在的属性。相当obj.name_str =value
    delattr()从一个对象中删除一个属性

    def bulk():
        print 'wang wang wang'
    
    class Dog (object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print('%s is eating %s'%(self.name,food))
    d=Dog('haha') #实例化一个对象d choice=raw_input('>>>:').strip() if hasattr(d,choice): #这里判断的是实例对象里是否存在 名字为choicezi字符串的方法 func=getattr(d,choice) #若存在,通过getattr 把实例的这个choice方法的内存地址赋值给func func('gutou') #func()来调用实例对象里的此方法 else: setattr(d, choice,bulk)#如果不存在,就在实例中加入一个属性bulk,这里只是加入了这个属性 #可以通过print dir(d)来查看,属性是否存在 func = getattr(d, choice) #在这一步,是在吧加入的新的属性的内存地址赋值给func,然后就可以调用了 func() #并没有传参数d,但运行正常?????


    class myclass(object): def __init__(self): self.foo=100 myinst=myclass() print hasattr(myinst,'foo') a=getattr(myinst,'foo') #这里foo字符串在实例myinst里是一个变量名,getattr(myinst,'foo') # 就是把此次变量的值赋值给a,如果不是变量,而是实例的一个方法,
    #就是把此方法的内存地址赋值给a
    print a print hasattr(myinst,'bar') #b=getattr(myinst,'bar') #AttributeError: 'myclass' object has no attribute 'bar' #print b print setattr(myinst,'bar',None) #等同于myinst.bar=None print dir(myinst) #返回 'bar', 'foo' delattr(myinst,'bar') print dir(myinst) #返回'foo' '''
  • 相关阅读:
    JS判断是PC端还是移动端
    js对象转数组
    js获取当前域名、Url、相对路径和参数以及指定参数
    javascript返回上一页的三种写法
    js正则归纳总结
    higtcharts 生成图表个数问题
    js如何处理后台传递过来的Map
    jQuey实现鼠标滑过整行变色
    <display:column>常用属性解释
    <display:table>常用属性解释
  • 原文地址:https://www.cnblogs.com/luckycn/p/7137749.html
Copyright © 2011-2022 走看看