十八、面向对象进阶

本文深入探讨了Python面向对象编程的关键概念,包括成员类型如实例变量、类变量、方法和属性,成员修饰符的公有与私有,以及对象嵌套。此外,还详细阐述了特殊成员,如初始化方法`__init__`、构造方法`__new__`、函数方法`__call__`、类说明方法`__str__`、类属性转字典方法`__dict__`、迭代器相关方法`__iter__`、`__next__`,以及生成器和可迭代对象。示例代码展示了如何在实际编程中应用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、成员
1.1变量
  • 实例变量: 属于对象, 每个对象都各自封装自己的值, 只能通过对象调用
  • 类变量: 属于类, 每个类中各自保存的数据, 可以通过对象和类进行调用
1.2方法
  • 绑定方法: 默认有一个self参数, 由对象进行调用(此时self就等于调用放的这个对象)
  • 类方法: 默认有一个cls参数, 用类或对象都可以调用(cls就等于调用方法的这个类)
  • 静态方法: 无默认参数, 用类和对象都可以调用
1.3属性
基于方法+property装饰器实现可以实现,可以实现
    obj.属性名
    obj.属性名 = 123
    del obj.属性名
语法和方法的对应关系。

二、成员修饰符

python成员修饰符就是: 公有, 私有

  • 公有: 在任何地方都可以调用的这个成员
  • 私有: 只有在类的内部才可以调用这个成员

示例:

class Foo(object):

    def __init__(self, name, age):
        self.__name = name
        self.age = age

    def get_data(self):
        return self.__name

    def get_age(self):
        return self.age


obj = Foo("你打我呀", 123)


# 公有成员
print(obj.age)
v1 = obj.get_age()
print(v1)

# 私有成员
# print(obj.__name) # 错误,由于是私有成员,只能在类中进行使用。
v2 = obj.get_data()
print(v2)

按理说私有成员是无法被外部调用,但如果用一些特殊的语法也可以

示例:调用时加一个下划线:‘_’

class Foo(object):

    def __init__(self):
        self.__num = 123
        self.age = 19

    def __msg(self):
        print(1234)


obj = Foo()
print(obj.age)
print(obj._Foo__num)
# 调用私有成员
obj._Foo__msg()

3.对象嵌套

在基于面向对象进行编程, 对象之前可以存着各种且套

例如: 组合, 关联, 依赖等

示例:

class Student(object):
    """ 学生类 """

    def __init__(self, name, age, class_object):
        self.name = name
        self.age = age
        self.class_object = class_object

    def message(self):
        data = "我是一名{}班的学生,我叫:{},我今年{}岁".format(self.class_object.title, self.name, self.age)
        print(data)


class Classes(object):
    """ 班级类 """

    def __init__(self, title):
        self.title = title


c1 = Classes("Python全栈")
c2 = Classes("python人工智障")

user_object_list = [
    Student("王大爷", 19, c1),
    Student("你大爷", 19, c1),
    Student("李大爷", 19, c2)
]

for obj in user_object_list:
    print(obj.name,obj.age, obj.class_object.title)

四、特殊成员

在python中类中存着一些特殊的方法, 这些方法都是__方法名__格式, 这种方法在内部均有特殊函数

4.1 init: 初始化方法
class Foo:
    def __init__(self, name):
        self.name = name

obj = Foo('王大爷')
4.2 new: 构造方法
class Foo:
    def __init__(self, name):
        print('第二部: 初始化对象, 为空对象中创建数据')
        self.name = name

    def __new__(cls, *args, **kwargs):
        print('第一步: 创建一个空对象')
        return object.__new__(cls)

obj = Foo()        
4.3 call : 函数方法, 实例化后以函数的方式执行
class Foo:
    def __call__(self, *args, **kwargs):
        print('执行call方法')

obj = Foo()
obj()
4.4__str__: 类说明方法
class Foo(object):

    def __str__(self):
        return "哈哈哈哈"


obj = Foo()
data = str(obj)
print(data)
4.5 dict : 类属性转字典方法
class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

obj = Foo('李大爷', '21')
print(obj.__dict__)
4.6 getitem, setitem, delitem
class Foo(object):

    def __getitem__(self, item):
        pass

    def __setitem__(self, key, value):
        pass

    def __delitem__(self, key):
        pass


obj = Foo("王大爷", 19)

obj["x1"]
obj['x2'] = 123
del obj['x3']
4.7 enter, exit : 上下文管理用于前后事务处理
class Foo:

    def __enter__(self):
        print('我进来了啊')
        return 666
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('我出来了啊')

with Foo() as data:
    print(data)
4.7 add: 对象+值, 内部会去执行, 对象.__add__方法, 后面的值当做参数传参过去
class Foo:
    def __init__(self, name):
        self.name = name 
    
    def __add__(self, other):
        return '{}-{}'.format(self.name, other.name)

v1 = Foo('李大爷')
v2 = Foo('王大爷')

v3 = v1 + v2
print(v3)
4.8 iter: 迭代器
  • 迭代器的定义:
1.当类中定义__iter__ 和 __next__两个方法
2.__iter__方法需要返回对象本身, 即: self
3.__next__方法返回下一个数据, 如果没有数据了, 则需要抛出一个StopIteration的异常

示例:

class Foo:
    def __init__(self):
        self.counter = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration()
        return self.counter


obj1 = Foo()

v1 = next(obj1)
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1)

obj2 = Foo()
for item in obj2:
    print('item')
4.9 生成器
# 创建生成器
def func():
    yield 1
    yield 2

# 创建一个生成器对象(内部是根据生成器类generator创建对象), 生成器类的内部也声明了: __iter__ , __ncet__方法
obj = func()
v1 = next(obj)
print(v1)
v2 = next(obj)
print(v2)
v3 = next(obj)
obj2 = func()
for item in obj2:
    print(item)   # 生成器类也是一种特殊的迭代器类
4.10 可迭代对象

如果一个勒种有一个__iter__方法切返回一个迭代器对象, 则我们以这个类创建的对象为可迭代对象

class Foo:
    def __iter__(self):
        return  迭代器对象或生成器对象


obj = Foo()

# 可迭代对象是可以使用for来进行循环,在循环的内部其实是先执行__iter__方法
# 获取起迭代器对象, 然后旁边在内部执行这个迭代器对象的next功能, 逐步取值
for item in obj:
    pass

示例:

class IterRange:

    def __init__(self, num):
        self.num = num
        self.counter = 1

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == self.num:
            raise StopIteration()
        return self.counter


class Xrange:

    def __init__(self, max_num):
        self.max_num = max_num

    def __iter__(self):
        return IterRange(self.max_num)


obj = Xrange(100)

for item in obj:
    print(item)
  • 可迭代的数据类型

字符串, 列表, 元祖, 字典, 集合

  • 不可迭代数据类型

布尔值, 数据 整形, 浮点型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值