面向对象,类

Posted lucky娜娜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象,类相关的知识,希望对你有一定的参考价值。

#-*- 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‘ ‘‘‘

 

以上是关于面向对象,类的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

JAVA方法的定义

Java多线程与并发库高级应用-工具类介绍

Java多线程与并发库高级应用-工具类介绍