类和对象
类是对象的蓝图和模板,而对象是类的实例
定义类
class class_name(object):
def __init__(self):
pass
if __name__=='__main__':
案例1:
#打印进度条
import time
class Rose(object):
def __init__(self):
pass
def main(self):
for i in range(1,101):
time.sleep(0.1)
print('#'*(i),'%d %%'%i)
if __name__=="__main__":
rose=Rose()
rose.main()
案例2:
#打印20个进度条,总共100%
import time
class Rose(object):
def __init__(self):
self.count=1
def main(self):
for i in range(1,101):
time.sleep(0.1)
res ='#'*self.count
print('%s %d %%'%(res,(i+5)))
self.count+=1
if __name__=="__main__":
rose=Rose()
rose.main()
私有变量,变量名前面加"__"
如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字.
私有变量/函数,在类内部可以直接调用.
如果你想体现一个变量/函数特别重要你可以使用"_"
案例
#输出文档中大写个数
class gxr(object):
def __init__(self,path):
self.path=path
self.count=0
def read(self):
with open(self.path,mode='r') as f:
lines =f.readlines()
for line in lines:
new_line=line.strip('\n')
for i in new_line:
if i.isupper():
self.count+=1
print('The Upper word is %d'%self.count)
if __name__=='__main__':
path='/Users/郭香如/test.txt'
gxr=gxr(path)
gxr.read()
结果:The Upper word is 19
面向对象进阶
@property装饰器
如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作,考虑使用@property包装器来包装getter和setter方法
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
# 访问器 - getter方法
@property
def name(self):
return self._name
# 访问器 - getter方法
@property
def age(self):
return self._age
# 修改器 - setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)
def main():
person = Person('王大锤', 12)
person.play()
person.age = 22
person.play()
if __name__ == '__main__':
main()
静态方法和类方法
静态方法:
在开发中,我们常常需要定义一些方法,这些方法跟类有关,但在实现时并不需要引用类或者实例,Python 使用装饰器@staticmethod来定义一个静态方法
实例:
from math import sqrt
class Triangle(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
@staticmethod
def is_valid(a, b, c):
return a + b > c and b + c > a and a + c > b
def perimeter(self):
return self.a + self.b + self.c
def area(self):
half = self.perimeter() / 2
return sqrt(half * (half - self._a) *
(half - self._b) * (half - self._c))
def main():
a, b, c = 3, 4, 5
# 静态方法和类方法都是通过给类发消息来调用的
if Triangle.is_valid(a, b, c):
t = Triangle(a, b, c)
print(t.perimeter())
# 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
# print(Triangle.perimeter(t))
print(t.area())
# print(Triangle.area(t))
else:
print('无法构成三角形.')
if __name__ == '__main__':
main()
结果:
12
6.0
类方法
Python 的类方法采用装饰器@classmethod来定义,(类本身也是一个对象,有的地方也称之为类的元数据对象)
统计类Gxr实例的个数,因此定义了一个类变量count来存放实例个数。通过装饰器@classmethod的使用,方法B被定义成一个类方法。在调用类方法时,Python 会将类(class Gxr)传递给self,这样在B内部就可以引用类变量count。
class Gxr(object):
count= 0
def __init__(self):
Gxr.count += 1
@classmethod
def B(self):
return self.count
def main():
ik1 = Gxr()
ik2 = Gxr()
print(ik1.B())
print (Gxr.B())
if __name__ == '__main__':
main()
结果:
2
2