【廖雪峰Python学习笔记】面向对象编程OOP

面向对象编程

  • OOP:Object Oriented Programming
  • 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法]
  • 三大特点:数据封装、继承和多态
  • OPP中的计算机程序:
    一系列命令的集合 —— 一组函数顺序执行。函数化大为小,降低复杂度
    一组对象的集合 —— 对象之前互相传递和处理消息

类和实例

  1. 概念
  • class:创建实例的抽象的模板
  • 实例instance:由类创建的具体“对象”
    各实例拥有的数据互相独立、互不影响
  1. 数据封装
    类中声明函数,访问数据
  2. tips
  • class后紧接着类名 —— 大写开头单词Student
  • Student(object)表明Student类是从object类继承下来的
  • __init__方法,第一个参数永远是self,表示创建的实例本身,绑定各种属性
class Animal(object):
	# __init__方法存在时,创建实例不能传入空参数
    def __init__(self, name, score):	
        self.name = name
        self.age = age

    def get_age(self):
        return self.name + 'is'+self.age + 'years old'            
  • 创建实例时,不能传入空参数,必须传入与__init__方法匹配的参数,self除外
>>> stu = Student('Litter cat',1)
>>> stu.get_grade()
'Litter cat is 1 years old'

访问限制

公有变量public && 私有变量private

class Student(object):
	# __init__方法存在时,创建实例不能传入空参数
    def __init__(self, name, score):	
        self.__name = name	# 私有变量,外部不可访问或修改
        self.score = score	# 公有变量,外部可通过stu.score直接访问或修改

    def get_name(self):				# 私有变量需要调用内部封装的函数get_name()访问变量
    	return self.__name  
    	      
	def set_name(self, name):		# 私有变量需要调用内部封装的函数set_name()修改变量
    	self.__name = name
  • Python中,__xxx__类型为特殊变量,不是private变量
  • _xxx_类型为可访问变量,但尽量不要随意访问

集成和多态

子类Subclass 继承 父类|基类|超类:

  1. 继承:子类获取父类的全部功能
  2. 多态:子类和父类拥有相同方法时,子类覆盖父类
  3. 新增子类的“开闭”原则:
    对扩展开放:允许新增子类
    对修改封闭:不需要修改依赖类型的函数
class Animal(object):
    def sleep(self):
        print('Animal is sleeping…')            
        
class Dog(Animal)
	def sleep(self):
		print('Dog is sleeping…')
	def run(self):
		print('Dog is running…')
	
class Cat(Animal)
	def sleep(self):
		print('Cat is sleeping…')	

其中dogcat类都继承于Animal

>>> ani = Animal()
>>> ani.sleep()
'Animal is sleeping…'
>>> dog = Dog()
>>> dog.sleep()
'Dog is sleeping…'
>>> dog.run()
'Dog is running…'

获取对象信息

  1. type():判断对象类型
>>> type(1)
<class 'int'>
>>> type(())
<class 'tuple'>
>>> type([])
<class 'list'>
>>> type(None)
<class 'NoneType'>
>>> type('1') = type('abc')
True
>>> type(False) == bool
True
  1. isinstance():判断继承关系
>>> isinstance((1,2,3),(list,tuple))
True
>>> isinstance([1,2,3],(list,tuple))
True
>>> isinstance(b'a',bytes)
True
>>> isinstance(Students,object)
True
  1. dir():获取一个对象的所有属性和方法
>>> dir(1)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

dir()可配合getaddr()setaddr()hasaddr(),直接操作一个对象的状态

实例属性和类属性

  1. 通过实例变量或者self变量可为实例绑定属性
  2. 类属性,归类所有,实例中属性的更改不会对类中的属性造成影响
>>> class Demo():   
		name = 'Demo'
>>> d = Demo()	# 初始化实例d
>>> d.name		# 未赋值前,实例与类共用属性
'Demo'
>>> Demo.name
'Demo'
>>> d.name = 'D'# 实例中属性改变,不影响类中的属性
>>> Demo.name
'Demo'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值