-
Notifications
You must be signed in to change notification settings - Fork 0
/
class.py
133 lines (98 loc) · 3.83 KB
/
class.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!coding=utf-8
#python 类的定义
class Account(object):
num_accounts = 0 #此处的 num_accounts 为类变量,所有的实例共享
def __init__(self,name,blance):
self.name = name
self.blance = blance
Account.num_accounts +=1
def __del__(self):
Account.num_accounts-=1
def inqirey(self):
return self.blance
#访问类的成员的方法
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
#@clssmethod 类方法是将类本身作为对象进行操作的方法,与实例方法不同,因为根据约定,类是作为第一个参数(名为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