13 python学习笔记-面向对象编程2

一、构造函数和析构函数

 1 class Person:
 2     def __init__(self): #构造函数  类在实例化的时候自动调用的方法
 3         self.__base_price = 8000
 4         print('构造函数')
 5 
 6     def __del__(self): #析构函数  实例被销毁之后自动调用
 7         print('析构函数')
 8 
 9     def say(self):
10         print('say')
11 
12     def set_price(self,discount):  #实例方法
13         self.__base_price = self.__base_price - self.__base_price * discount
14         return self.__base_price
15 
16     def get_price(self):
17         return self.__base_price
18 
19 if __name__ == '__main__':
20     xh = Person() #实例化
21     xh.say()
22     print(xh.set_price(0.5))
23     print(xh.get_price())
24 
25 #结果
26 构造函数
27 say
28 4000.0
29 4000.0
30 析构函数

二、私有方法和私有属性

私有就是只有在类里面可以访问,实例化之后不可以访问和调用,有私有方法和私有属性。私有就把变量名或者函数名前面加上"__"两个下划线,其实就是通过私有来实现封装的。

 1 class Dog(object):
 2     __type = ''  # 私有属性
 3 
 4     def cry(self):
 5         self.__test()  # 调用私有方法
 6         print('私有属性%s' % self.__type)
 7         print('狗 [%s] 汪汪汪' % self.name)
 8 
 9     def __test(self):  # 私有方法
10         self.name = 'test'  #
11 
12 
13 d = Dog()
14 d.cry()  # 正常可以调用
15 d.__type  # 报错,因为是私有属性,在外面不能访问
16 d.__test()  # 报错,因为是私有方法,在外面不能访问

三、静态方法和类方法

 1 class Person: #经典类
 2     #属性就是变量
 3     #功能就是函数
 4     country = 'China' #类变量
 5     base_price = 8000
 6     discount = 0.1
 7 
 8     def __del__(self):
 9         pass
10 
11     @staticmethod  #静态方法,和类本身没有什么关系了,就相当于在类里面定义了一个方法而已
12     def help():
13         print("这个类是造机器人的")
14 
15     @classmethod   #类方法,和静态方法不同的是,它可以使用类变量,必须要传一个值,代表的就是这个类
16     def getClassname(cls):
17         print('Person')
18 
19     @classmethod
20     def sayCountry(cls):
21         #代表的本身这个类,可直接调用类方法
22         cls.getClassname()
23         print(cls.country)
24 
25     def __init__(self,uid,name):  #构造方法
26         print('self的内存地址:',id(self))
27         self.id = uid #实例变量
28         self.name = name #pep8
29 
30     def cook(self): #实例方法
31         print('%s鱼香肉丝'%self.name)
32 
33     def housework(self):
34         print('%s正在做家务'%self.name)
35         print('国籍是%s'%self.country)
36 
37     @property  #私有方法
38     def price(self,):
39         return self.base_price - self.base_price * self.discount
40 
41 if __name__ == '__main__':
42     Person.country = 'USA' #修改类属性
43     Person.sayCountry()  #直接调用类方法,无需实例化
44     Person.help() #直接调用静态方法,无需实例化
45 
46     xh = Person(1,'小黑')  #__init__(xh,1,'小黑'),实例化
47     xh.housework() #housework(xh),调用实例方法
48     xh.sayCountry() #实例化后调用类方法
49     xh.help()  #静态方法可直接调用,也可实例化后再调用
50     print(xh.country)
51 
52 #结果:
53 Person
54 USA
55 这个类是造机器人的
56 self的内存地址: 2048490123392
57 小黑正在做家务
58 国籍是USA
59 Person
60 USA

四、抽象类和反射

1、抽象类:

 1 import abc
 2 
 3 class BaseCar(metaclass=abc.ABCMeta): #这个是一个抽象类,只是用来继承的
 4     def __init__(self,uid):
 5         self.uid = uid
 6 
 7     @abc.abstractmethod #如果抽象类里面的函数通过abstractmethod修饰,那就在子类里面必须实现
 8     def run(self):
 9         pass
10     
11 class Bmw(BaseCar): #子类,继承父类BaseCar
12     def run(self):  #重写父类里的抽象类
13         print('run')
14 
15 m = Bmw('uid') #因父类构造函数有参数uid,因此子类实例化的时候要传这个参数
16 m.run() #调用实例方法

 2、反射:

指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。python面向对象中的反射:即通过字符串的形式操作对象相关的属性;python中的一切事物都是对象(都可以使用反射)

四种可以实现自省的函数:1.hasattr 2.setattr 3.getattr 4.delattr

 1 class Custom:
 2     feature='black'
 3     def __init__(self,name,addr):
 4         self.name=name
 5         self.addr=addr
 6     def buy_house(self):
 7         print('%s正在买房子'%self.name)
 8     def rent_house(self):
 9         print('%s正在租房子' %self.name)
10 z1=Custom('李梅','北京')
11 #对象是否有某种属性
12 print(hasattr(z1,'name'))  #True
13 print(hasattr(z1,'buy_house'))   #True
14 print(hasattr(z1,'zyy'))  #False
15 #取对象的某种属性
16 print(getattr(z1,'name'))  #李梅
17 print(getattr(z1,'rent_house'))
18 print(getattr(z1,'i am a sheep','没有这个属性')) #没有这个属性,找不到只会返回后面的值,不会报错
19 #为对象设置某种属性
20 setattr(z1,'李白',True)
21 print(z1.__dict__)  #{'name': '李梅', 'addr': '北京', '李白': True}
22 #删除对象某种属性
23 delattr(z1,'李白')
24 print(z1.__dict__)  #{'name': '李梅', 'addr': '北京'}
25 
26 #结果
27 True
28 True
29 False
30 李梅
31 <bound method Custom.rent_house of <__main__.Custom object at 0x0000020FDC26E7F0>>
32 没有这个属性
33 {'name': '李梅', 'addr': '北京', '李白': True}
34 {'name': '李梅', 'addr': '北京'}
posted @ 2019-11-19 14:37  落落mo  阅读(171)  评论(0编辑  收藏  举报