zoukankan      html  css  js  c++  java
  • 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': '北京'}
  • 相关阅读:
    Oracle 创建表并设置主键自增
    Oracle 基本知识回顾
    关于JAVAweb的一些东西
    JAVA获取运行环境的信息
    关于正则表达式的一些东西
    关于jQuery的一些东西
    关于JS的一些东西
    thymeleaf 的使用
    小程序flex容器
    Vue组件化
  • 原文地址:https://www.cnblogs.com/cocomoly/p/11889143.html
Copyright © 2011-2022 走看看