python面向对象#3

一.面向对象之组合

        什么是组合:它不是一个新的技术栈,他是对象的另一种用法,一个对象拥有一个属性,该属性就是另一个对象。

示例:

"""一个对象拥有一个属性,该属性的值就是另一个对象"""


class A:
    def __init__(self, m):
        self.m = m


class B:
    def __init__(self, n):
        self.n = n


obj = A(10)
obj1 = B(20)
obj2 = obj1
print(obj2.n)

什么场景下使用组合什么场景下使用继承:

继承一般是is 什么是什么的情况下而组合是什么有什么的情况下

"""使用组合来进行下面代码的执行"""


class People:
    def __init__(self, name, age, gender, course_name=None, course_time=None):
        self.name = name
        self.age = age
        self.gender = gender
        self.course_name = course_name
        self.course_time = course_time


class Name(People):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)


class Course:
    def __init__(self, name, time):
        self.name = name
        self.time = time

py = Course('python', '120min')
L = Course('linux', '222min')
# print(py.name)
# print(py.time)


class Student(People):
    def __init__(self, name, age, gender, course=None):
        super().__init__(name, age, gender)
        if course is None:
            course = []
        self.course = course


stu = Student('ll', 29, 'female')
stu.course.append(py.name)  # python
stu.course.append(py.time)  #120min
print(stu.course)   # 'python', '120min'
for i in stu.course:
    print(i)    # python  120min


class Teacher(People, Course):
    def __init__(self, name, age, gender, level):
        super().__init__(name, age, gender)
        self.level = level

t = Teacher('cc', 22, 'mael', 77)
print(t.name)
print(t.age)
print(t.level)

t.course = L
print(t.course.time)
print(t.course.name)

    

二 .反射

        在python中反射是使用字符串来操作对象的属性,涉及到的四个内置函数的使用,分别为:

        

"""反射所使用的四个内置函数"""

getattr() # 获取属性

setattr() #修改属性

delattr() #删除属性

hasattr() # 判断属性是否存在

示例:

class Student:
    school = 'SH'

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

    def func(self):
        print('form func')

    def __index__(self):
        print('from index')

stu = Student('l', 22)
print(Student.school)
"""反射:通过字符串操作对象的属性
1. 获取属性如果查询的属性,如果给了第三个参数,那么将返回第三个参数的值"""
res = getattr(stu, 'school', 777)
print(res)
res1 = getattr(stu, 'name', 'SK')
res2 = getattr(stu, 'age')

print(res, res1, res2)
print(stu.school)

函数的用法:

        

class Student:
    school = 'SH'

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

    def func(self):
        print('from func')

    def index(self):
        print('from index')

stu = Student('kk', 19)
print(stu.name)
print(stu.age)

res = getattr(stu, 'school')
print(res)
res1 = getattr(stu, 'name1', 'hhh')
print(res1)

res2 = getattr(stu, 'func1', stu.index)
print(res)
res2()


"""可以使用hasattr来做判断"""
if hasattr(stu, 'func'):
    getattr(stu, 'func')
else:
    print('权限不足')

    
"""使用delattr用来操作删除"""
delattr(stu, 'index')
if hasattr(stu, 'func'):
    getattr(stu, 'func')
else:
    delattr(stu, 'func')
    

调用类时,使用字符串来操作。

        利用字符串使用模块

        

三 .内置方法与魔术方式

内置方法有什么特点:双下划线开头的例如__init__。当它满足一定条件后便会触发。

1. __str__, repr

        

"""打印对象时输出对象时会自动触发__str__
当__str__和__repr__同时存在时,优先执行__str__
返回值必须是字符串类型"""


class Student:

    school = 'SH'

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

    def __str__(self):
        print('123')
        return 'fromstr'    # 返回值必须是字符串类型

    def __repr__(self):
        print('234')
        return 'from repr'

stu = Student('sds', 22)
print(stu)  # 123 fromstr

2.__del__
"""
  1.当你删除对象的时候会触发__del__的执行
  2. 当整个脚本的程序都执行完毕的时候,也会触发__del__的执行
  3. 一般用在用来在对象被删除时自动触发回收系统资源的操作
  """

class CC:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.f = open('a.txt', 'w')

    def __del__(self):
        print('form _del')
        self.f.close()

la = CC(1231, 9999)
    ### 当所有程序执行完成后,在进行del删除
print(la)
print('2222') #2222 form _del

3. enter和exit

        当出现with语句是,__enter__才能被触发,如果有返回值,则赋予给as声明的变量

        __exit__则是当with语句执行完成时,触发__exit__, with语句可以用在多个地方,当出现with语句时,后面的对象必须使用__enter__和__exit__

示例:


class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('执行__enter__')    # 当执行with语句时执行,并且返回值返回给as后的变量


    def __exit__(self, exc_type, exc_val, exc_tb):
        print('执行__exit__') # 当with语句执行完之后,执行__exit__

    # with open('a.txt')as f:
    #     print('执行')
    #     print(f, f.name)
    #

    """如果出现异常,则不会执行with后面的代码都不能正常执行"""

    with open('a.txt')as f:
        print('执行')
        raise AttributeError('主动报错')
    print('会执行吗')

    """ 打印结果为 raise AttributeError('主动报错')
AttributeError: 主动报错"""

4. setattr,delattr,getattr)

        __setattr__,__delattr__,__getattr__


class A:
    y = 100

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

    """当所查找的属性不存在时,执行__getattr__"""

    def __getattr__(self, item):
        print('找不到了,不执行')

    def __setattr__(self, key, value):
        print('我会执行')
        self.__dict__[key] = value

    def __del__(self, item):
        print('删除')
        self.__dict__.pop(item)

obj = A(10)
print(obj.y)
del obj.x
print(obj.x)

"""执行结果为我会执行
100
找不到了,不执行
None"""

5. __setitem,getitem,delitem__

示例:


class B:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        print('__getattr__')
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        print('__setattr__')
        self.__dict__[key] = value

    def __delitem__(self, key):
        print('当obj= [key]时执行')
        self.__dict__.pop(key)
        pass

obj = B('mama')
obj['age'] = 18
print(obj.age)
del obj['age']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值