`

python 类

 
阅读更多

#!coding=utf-8

 

#python 类的定义

class Account(object):

    num_accounts = 0    #此处的 num_accounts 为类变量,所有的实例共享

    def __init__(self,name,blance):  #__init__ 在类的实例创建后被立即调用。它可能会引诱你称之为类的构造函数,

                                #但这种说法并不正确。说它引诱,是因为它看上去像 (按照习惯,__init__ 是类中第一个定义的方法),

#行为也像 (在一个新创建的类实例中,它是首先被执行的代码),并且叫起来也像 

#(“init”当然意味着构造的本性)。说它不正确,是因为对象在调用 __init__ 时已经被构造出来了,

#你已经有了一个对类的新实例的有效引用。但 __init__ 是在 Python 中你可以得到的最接近构造函数的东西,

#并且它也扮演着非常相似的角色。

        self.name = name

        self.blance = blance

        Account.num_accounts +=1

 

    def __del__(self):

        Account.num_accounts-=1

 

    def inqirey(self):

        return self.blance

 

#__init__ 方法是可选的,但是一旦你定义了,就必须记得显示调用父类的 __init__ 方法 

#(如果它定义了的话)。这样更是正确的:无论何时子类想扩展父类的行为,后代方法必须在适当的时机,使用适当的参数,显式调用父类方法

 

#访问类的成员的方法

print Account.num_accounts

print Account.__init__

 

class Money(object):

    def __init__(self,types,num,name,action):

        self.types = types

        self.num = num

        self.name=name

 

class Test(Money,Account):#python类的多继承,python虽然支持多继承,但是最好使用单继承,免得混淆

    def inqirey(self):

        super(Test,self).inqirey() #调用父类的inqirey()方法

    print "hello"

    pass

 

#t = test('jack',4)

 

#print Test.__mro__   要找到使用了多重继承的属性,可以在列表中队所有基类按从“最特殊”的类到“最不特殊的类这种进行排列,

#然后再搜索属性时,就会按账号顺序搜索列表,直到找到该属性

#第一个定义,对于任何一个类,通过打印它的__mro__属性即可看到基类的顺序,例如Test类中的name属性,如果要打印name属性,到底是Money,中的name,还是Account的name,是按照基类的继承属性来的

 

 

*****静态方法

#@staticmethod 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类进程操作,

#如果在编写类时需要采用很多种不同方式来创建新实例,则常常使用静态方法

import time

class Date(object):

    def __init__(self,year,month,day):

        self.year = year

        self.month = month

        self.day = day

 

    def test(self):

        print "hello"

    @staticmethod

    def now():

        t = time.localtime()

        return Date(t.tm_year,t.tm_mon,t.tm_mday)

    @staticmethod

    def tomorrrow():

        t  = time.localtime(time.time()+86400)

        return Date(t.tm_year,t.tm_mon,t.tm_mday)

 

a = Date(1967,4,5)

b = Date.now()

print b.day

 

c = Date.tomorrrow()

print c.day

 

 *****类方法

#@classmethod 类方法是将类本身作为对象进行操作的方法,与实例方法不同,因为根据约定,类是作为第一个参数(名为cls)传递的,实例方法是self作为第一个参数

class Times(object):

    factor = 1

    @classmethod

    def mul(cls,x):

        return cls.factor*x

 

class TwoTimes(Times):

    factor = 2

 

x = TwoTimes.mul(4)  #调用Times.mul(TwoTimes,4)

 

 

*****特性

#@property  支持以简单形式访问后面的方法,无需像平常一样添加额外的()调用该方法

import math

c = None

class Circle(object):

    def __init__(self,radius):

        self.radius = radius

    @property

    def area(self):

        return math.pi*self.radius**2

 

c = Circle(5)

print c.area

 

 

#数据封装和私有属性

#私有属性,其他子类是不能访问的

#类中所有以双下划线(__)例如:__foo ,都会自动变形,形成具有_类名__foox形式的新名称,这提供了一种在类中包含私有属性和私有方法的有效方式

#,因为派生类中使用的私有名称不会与

#基类中使用的相同私有名称发生冲突

 

class A(object):

    def __init__(self):

        self.__x = 3        #变形为self._A__x

    def __spam(self):

        pass                #变形为_A__spam()

    def bar(self):

        self.__spam         #调用A.__spam()

 

class B(A):

    def __init__(self):

        A.__init__(self)

        self.__x = 37

    def __spam(self):

        print "hello"                #变形为_B__spam()

 

 

 

class T(object):

    __slots__ = ('name','blance')

    def __init__(self):

        self.name = 'jack'

        self.blance = '120'

        self.hometowm='wuhan'

 

 

class M(T):

    pass

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics