注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

python中的类  

2011-02-23 18:09:00|  分类: Web技术-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

print('========================定义类==========================')

class Person:

    #注意在类中定义方法时:必须有一个额外的第一个参数名称,一般使用'self'为变量名

    #在PHP中self是一个关键字

    #构造函数(开始和结尾都是双下划线),这与PHP中的__construct类似

    def __init__(self,name): #必须有self且要写在最前面

        self.name = name

    #普通函数

    def say(self):

        print('Hello,how are your?',self.name)

p = Person('fclamp') #实例化时,不再像PHP一样需要加new关键字了

print(p)

p.say() #在调用函数时,你可以不传入self参数,因为Python会自动加上的


print('=======================访问成员变量============================')

class Person:

    population = 0 #公有成员变量

    obj_popu   = 0

    _protect   = 3#单下划线

    __private  = 6 #双下划线表示私有变量

    #---

    def __init__(self,name): #注意self是必须的

        self.name = name #此动态的给Person实例对象加上"name"成员变更(在PHP中也可)

        print('初始化:% s'%self.name)

        Person.population +=1 #这有点类似于PHP中的静态成员变量

        #注意这里用类名直接访问成员变量与用self去访问成员变量的不同

        self.obj_popu += 1

    #---

    def __del__(self): #这PHP中的__destruct方法类似,但是不能确定该方法在什么时候被运行

        print('删除了一名成员:',self.name)

        Person.population -+1

        if Person.population == 0:

            print ('I am the last one.')

        else:

            print('There are still %d people left'%Person.population)

    #---

    def say(self):

        print('Hi,my name is %s'%self.name)

    #---

    def get_private(self): #返回私有成员变量

        return self.__private

    #---

    def howMany(self):

         print('class people :',Person.population)

         #这里也可以用self.population,因为:类的变量由一个类的所有对象(实例)共享使用

         #并且只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,

         #这个改动会反映到所有其他的实例上。

         print('object people:',self.obj_popu)

         #这里用Person.obj_popu访问时返回为0,原因在于:

         #它首次被绑定到了类(Person)名称空间上

fc = Person('fclamp')

jk = Person('jk')

fc.say()

jk.say()

fc.howMany()

jk.howMany()

print('直接访问成员变量:',fc._protect)

#print('访问私有成员变量:',fc.__private) 对象不能直接访问私有成员变量

print('访问私有成员变量:',fc.get_private())


#动态获取对象属性

class test(object):

    def __init__(self):

        self.a=1

        self.b=2

        self.c=3

    def __getitem__(self,item):

        return getattr(self,item)

x = test()

print x.b

print x['b']


print('======================类的继承(成员变量的访问控制)==============================')

##########################

#在python中B继承A类格式为:class B(A):

#不再是PHP中的extends

##########################

class Letters:

    public = 'public' #公有

    _protect = 'protect' #保护

    __private = 'private' #私有

    def returnNum(self,letter):

        return self.__getLen(letter)

    def __getLen(self,letter):#私有方法

        return len(letter)

class abc(Letters): #继承

    pass #空语句

s = Letters()

print('字符串长度:',s.returnNum('ab'))

print('protect is :',s._protect)  #保护成员变量仍然能被类的实例访问(不过,这在PHP中是不行的)

#s.__getLen('ccs') #私有方法禁访问

s2 = abc() #abc类继承于Letters类

print('字符串长度:',s2.returnNum('a3b'))

print('protect is :',s2._protect)  #保护成员变量当然也可以被被子类的实例访问

#s2.__getLen('sdf') #私有方法禁访问


 

print('==========================装饰器=========================')

#定义静态方法,关键字: @staticmethod
#定义类方法,关键字:@classmethod
class Foo():
    var = 2
    @staticmethod
    def add(x,y):#定义静态方法时:参数里没有self
        return x+y
    @classmethod
    def add2(cls,x):#定义类方法时:类要作为第一个参数
        return cls.var+x
    def add3(self,y): #定义实例方法:self,以保证add3()方法为实例的属性
        return y+3
    @property  #使用用特性
    def calcu(self):
        return self.var*2


f = Foo()
print f.add(1,1) #实例调用静态方法
print f.add2(3)#实例调用类方法
print f.add3(5)#实例调用实例方法
print Foo.add(2,2) #静态方法
print Foo.add2(4) #类方法
#print Foo.add3(6) 是不能直接调用未实例化的方法
#从上可以看出类方法与实例方法是没有区分开的
#调用特性
print f.calcu

class myclass:

var1 = 1

def __init__(self):
self.var2 = 2

def method(self):
'''普通对象方法'''
print 'method',self.var1,self.var2

@staticmethod
def smethod():
'''静态方法 只是在类作用域里的一个函数'''
print unicode('smethod 无法访问 var1 var2','utf-8')

@classmethod
def cmethod(cls):
'''类方法'''
#print cls.var2
print 'cmode 能访问 var1 %s 不能访问var2'%(cls.var1)


my = myclass()
my.method()

myclass.smethod()

myclass.cmethod()
my.var1 = 'test1'
my.method()
myclass.cmethod()



另外:python里函数是支持匿名与返回多个值的:

def test():
    a = 'a'
    b = 'b'
    return a,b
(a,b) = test()
print('a is %s;b is %s'%(a,b))





  评论这张
 
阅读(264)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017