Python面向对象

本文深入探讨了Python的面向对象编程,包括基本语法、self语句的运用、魔法方法及其介绍,强调了方法的使用功能。同时,文章还讨论了面向对象的练习,如内置属性、对象和类属性的差异、私有属性的使用,以及类方法和静态方法。此外,介绍了单例设计模式,并详细阐述了面向对象的三大特性——继承,包括Python中的单继承、多继承和私有属性的继承特点。最后,提到了新式类和经典类的区别。
摘要由CSDN通过智能技术生成

Python面向对象

  1. 面向对象基本语法
# 小明今年18岁,身高 1.75,每天早上跑完步,回去 吃 东西
# 小美今年17岁,身高 1.65,小美不跑步,小美喜欢 吃 东西

# 定义类:类名的定义,使用class 来定义一个类
# class 类名: 类名一般需要遵守大驼峰命名法,每一个单词的首字母都大写
# 1. class <类名>:
# 2. class <类名>(object):


class Student(object):  # 关注这个类有哪些特征和行为
    # 在 __init__ 方法里,以参数的形式定义属性,称之为属性
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height

    def run(self):
        print(f'{self.name}正在跑步')

    def eat(self):
        print(f'{self.name}正在吃东西')


# 使用 Student 类创建了两个实例对象 s1 s2
# s1 和 s2 都会有name,age,height属性,同时都有run和eat 方法
s1 = Student('小明', 18, 1.75)
s2 = Student('小美', 19, 1.65)

# 根据业务逻辑,让不同的对象执行不同的行为
s1.run()
s1.eat()

s2.eat()

  1. self语句的使用
class Student(object):
    # 这个属性直接定义在类里,是一个元组,用来规定对象可以存在的属性
    __slots__ = ('name', 'age')
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def sayHello(self):
        print('大家好,我是', self.name)

# Student('张三', 18) 这段代码具体做了什么呢?
# 1. 调用 __new__方法,用来申请内存空间
# 2. 调用__init__ 方法传入参数,并让self 指向申请好的那段内存空间,填充数据
# 3. 让变量 s1 也指向创建好的这段内存空间
s1 = Student('张三', 18)
# print('0x%X:'% id(s1))  # 查看地址
print('s1 的名字是', s1.name)
# 谁调用self,self就是谁
s1.sayHello()
# 如果没有这个属性会报错
# print(s1.height)

# 直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
# 动态属性
s1.city = '上海'  # 给对象添加了一个city属性

# 如果这个属性以前存在,会修改这个属性对应的值
s1.name = '刘明'
print(s1.name)  # '刘明'

  1. __init__魔法方法
# 魔法方法,也叫魔术方法,是类里的特殊的一些方法
# 特点:
# 1、不需要手动调用,会在合适的时机自动调用
# 2、这些方法,都是使用 __ 开始,使用 __结束
# 3、方法名都是系统规定好的,在合适的时机自己调用
# import time
import datetime

n = datetime.datetime(2021, 4, 13, 8, 40, 54, 900)
print(n)  # 调用 __str__ 方法
print(repr(n))  # 调用 __repr__ 方法


class Person(object):
    def __init__(self, name, age):
        # 在创建对象时,会自动调用这个方法
        print('__init__方法被调用了')
        self.name = name
        self.age = age

    def __del__(self):
        # 当对象被销毁时,会自动调用这个方法
        print('__del__方法被调用了')

    def __repr__(self):
        return 'hello'

    def __str__(self):
        # return self.name, self.age  # 报错,TypeError: __str__ returned non-string (type tuple)
        return '{} {}'.format(self.name, self.age)

    def __call__(self, *args, **kwargs):
        # print('__call__方法被调用了')
        # args 是一个元组,保存(1, 2)
        # kwargs 是一个字典, 保存{'fn':lambda: x, y: x + y}
        print("args = {}, kwargs = {}".format(args, kwargs))
        fn = kwargs['fn']
        return fn(args[0], args[1])


p = Person('zhangsan', 18)
# 如果不做任何的修改,直接打印一个对象,是文件的__name__.类型 内存地址
# 当打印一个对象的时候,会调用这个对象的__str__ 或者 __repr__ 方法
# 如果这两个方法都写了,选择 __str__
print(p)
# print(repr(p))  # 调用内置函数 repr 会触发对象的 __repr__ 方法
# print(p.__repr__())  # 魔法方法,一般不手动的掉一共
# del p
# time.sleep(5)

# p()  # 对象名() ==> 调用这个对象的 p.__call__() 方法
m = p(1, 2, fn=lambda x, y: x + y)  # 调用这个对象的 p.__call__(1, 2) 方法
# print(m)

  1. __eq__方法的使用功能
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        # print('__eq__ 方法被调用了')
        # if self.name == other.name and self.age == other.age:
        #     return True
        # return False
        return self.name == other
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值