一文搞定Python类和对象

一 什么是面向对象

定义:利用面向对象(属性和方法)的过程去进行编码 自定义面向数据类型就是可面向对象中的类 关键字:class 声明类,名称首字母大写,多单词每个首字母大写

1 类的创建及使用

# 创建
class Person(object):  # 通用对像
    name = '小熊' # 类属性
    def dump(self) # 类方法
    print(f'{self.name})
          ###  缩进应该统一
# 实例化(使用)
xiong = Person()  # 实例化
print(xiong.name) # 实例化名字加点调用类属性
xiong.dump()      # 实例化名字加点调用类方法

补充

(1)想在类函数中调用属性,需要添加 self.属性名

(2)self 有两种功能 :可以调用类属性;同时也可以将函数定义到类中

2 类的参数self

  • 是类函数中的必传函数,且必须放在第一个参数
  • self是一个对象,可以实例化类变量自身
  • 可以通过点定义一个类变量“self.name=name
  • self的变量和有self的参数的函数可以在类中任何一个函数随意调用

3 类的构造函数(方法)

  • 是类的默认函数,用于实例化的同时,将参数传入类中
  • 创建方法
# 创建
class Person(object):  # 通用对像
    name = '小熊' # 类属性
    def dump(self) # 类方法
    print(f'{self.name})
          ###  缩进应该统一
# 实例化(使用)
xiong = Person()  # 实例化
print(xiong.name) # 实例化名字加点调用类属性
xiong.dump()      # 实例化名字加点调用类方法

对象的生命周期(Python中万物皆对象)

  • 1 当被重新赋值员变量就结束使用
  • 2 实例化之后是对象的开始,但默认会存在__del__,不用调用

4 私有函数与私有变量(封装)

  • 无法被实例化后对象调用类中的函数和变量
  • 类内部可以调用私有函数与私有变量
  • 目的:只希望类内部逻辑使用,不希望被调用者使用
  • 定义方法:在私有变量和私有函数的名字前加“__”两个下划线,后面不需要添加
# 私有变量与私有函数
 class  person (object):
 	def __init__(self,a,b):
 		self.name = name
 		self.__age = age  # 私有变量
 	def __run (self):   # 私有函数
 		print('我正在跑步')
 

5 装饰器

  1. 本质:函数
  2. 特点:可以接受函数作为参数,同时可以返回一个函数
  3. 原理:接收一个函数,内部对其调用和处理,然后返回一个新函数,动态增强函数功能
  4. 流程:将C函数在A函数中执行,在A函数中可以执行或不执行C函数,也可以对C函数的结果进行二次处理
  5. 使用方法

#  定义
 def check_str(func): # 外围函数
     print('func:', func)
     def inner(*args, **kwargs): # 内嵌函数
         print('args:', args, kwargs)
         result = func(*args, **kwargs)
         if result == 'ok':
             return 'result is %s' % result
         else:
             return 'result is failed:%s' % result
     return inner   # 返回内嵌函数 
 
# 使用
 @check_str
 def test(data):
     return data
 
 result = test(data='no')
 print(result)
 
 result = test(data='ok')
 print(result)
 

常用的装饰器

常用装饰器

6 类的继承与多态

  1. 子类定义时,可将父类传入子类参数中
  2. 子类实例化可以使用父类的函数与变量
  3. 继承分单继承和多继承。(多类继承时,若多个父类有相同方法名,子类实例化使用时,在父类寻找时,按继承时的参数顺序从往右)

# 1 2个父类
 
 class Tool(object):
     def work(self):
         return 'tool work'
 
     def car(self):
         return 'car will run'
 
 class Food(object):
     def work(self):
         return 'food work'
 
     def cake(self):
         return 'i like cake'
 
 # 继承父类的子类
 class Person(Food, Tool):
     pass
 
 if __name__ == '__main__':  # 程序入口
     p = Person()
     p_car = p.car()
     p_cake = p.cake()
     print(p_car)
     print(p_cake)
     p_work = p.work()
     print(p_work)
     print(Person.__mro__)
 
  1. 多态: 如果父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法

class Parent:        # 定义父类
 def myMethod(self):
 print ('调用父类方法')
 class Child(Parent): # 定义子类
 def myMethod(self):
 print ('调用子类方法')
 c = Child()          # 子类实例
 c.myMethod()         # 子类调用重写方法
 super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
 
  1. 类的super函数(可以在继承时,同时调用父类的构造函数)
class Parent(object):
     def __init__(self, p):
         print('hello i am parent %s ' % p)
 
 class Child(Parent):
     def __init__(self, c):
         super().__init__('parent')
         print('hello i am child %s ' % c)
 
 if __name__ == '__main__':
     c = Child(c='Child')
 

7 类的高级函数

  1. str 如果定义了该函数,当打印实例化时,会输出该函数的return语句(常用于输出该类的说明信息)返回值必须为string
  2. getatter 当调用的属性或方法不存在时,,会返回该函数的信息
  3. setatter 拦截当前类中不存在的属性与值
  4. call 类通过提供__call__()方法可以模拟函数的行为,如果一个对类提供了该方法,就可以像函数一样使用,实例化之后可以直接使用
class Test(object):
 
     def __str__(self):
         return 'this is a test class'
 
     def __getattr__(self, key):
         return '这个key:{}并不存在'.format(key)
 
     def __setattr__(self, key, value):
         self.__dict__[key] = value
         print(self.__dict__)
 
     def __call__(self, a):
         print('call func will start')
         print(a)
 
 t = Test()
 print(t)
 print(t.a)
 print(t.b)
 t.name = '小慕'
 print(t.name)
 t('dewei')
 # t.a.b.c 链式操作
 
 class Test2(object):
     def __init__(self, attr=''):
         self.__attr = attr
 
     def __call__(self, name):
         return name
 
     def __getattr__(self, key):
         if self.__attr:
             key = '{}.{}'.format(self.__attr, key)
         else:
             key = key
         print(key)
         return Test2(key)
 
 t2 = Test2()
 name = t2.a.b.c('dewei')
 print(name)
 
 result = t2.name.age.sex('ok')
 print(result)
 
 ### this is a test class
 这个key:a并不存在
 这个key:b并不存在
 {'name': '小慕'}
 小慕
 call func will start
 dewei
 a
 a.b
 a.b.c
 dewei
 name
 name.age
 name.age.sex
 ok
 ### 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值