python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(下)

简介: python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)

python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上):https://developer.aliyun.com/article/1483375


7.property方法


属性函数

class A(object):
    def __init__(self):
        self.__name = 18

    def __eat(self):
        return self.__name
        pass
    pass

    def run(self):
        print('跑步')
        pass
    pass

    age = property(__eat, run)


b = A()
print(b.age)  ## 报错
b.run()  ## 跑步

7.1 @age.setter ##修改属性

class A(object):
    def __init__(self):
        self.__name = 18

    def __eat(self):
        return self.__name
        pass
    pass

    def run(self):
        print('跑步')
        pass

    @property ##添加属性标识
    def age(self):
        return self.__name
    pass

    @age.setter ##修改属性
    def age(self,params):
        self.age  = params
        pass
    pass

p1 = A()
print(p1.age) ## 18
p1.age = 16
print(p1.age)

8. new方法


作用:创建并返回一个实例对象,如果new只调用了一次,就会得到一个对象。继承自object的新式类,才有new这一魔术方法。


8.1 注意事项

 1.__new__是一个实例化调用的第一个方法
 2.__new__至少必须有一个参数 cls,代表要实例化的类,此参数在实例化时由python解释器提供,其他的参数是直接传递给__init__方法
 3.__new__决定是否使用该__init__方法,因为__new__可以调用其他的类的构造方法或者返回实例对象作为类的实例,如果__new__没有返回实例,则__init__不会被调用
 4.在__init__方法中,不能调用自己的__new__方法,return cls__new__(cls),否则会报错。
class A(object):
    def __init__(self):
        print('__init__执行了')
        pass
    pass

    def __new__(cls,*args,**kwargs):
        return super().__new__(cls,*args,**kwargs)
        pass
    pass

a = A()
print(a)

__init__执行了
<__main__.A object at 0x00000291F97D5160>

## 当__new__返回的时候 __init__才会显示

9.单例模式


9.1 确保一个类只有一个实例存在,使用new

class DataBaseClass(object):
    def __new__(cls,*args,**kwargs):
        ## cls._instance = cls.__new__(cls) ##不能使用自己的new方法
        if not hasattr(cls,'_instance'):
            cls._instance = super().__new__(cls,*args,**kwargs)
        return cls._instance
        pass
    pass

db1 = DataBaseClass()
db2 = DataBaseClass()
db3 = DataBaseClass()
print(id(db1))
print(id(db2))
print(id(db3))

## 三个指向的内存地址都一样的
## 1852298514784
## 1852298514784
## 1852298514784

10 错误和异常处理


try:
    ## 可能出现错误的代码块
except:
     ## 出错之后执行的代码块
else:
     ## 没有出错的代码块
finally:
    ## 不管有没有出错,都会执行

10.1 错误和异常处理示例

try:
    ## 可能出现错误的代码块
    li = [1,2,3]
    ## print(li[10])
    print(1/0)

except IndexError as msg:
    ## 出错之后执行的代码块
    print(msg)

except ZeroDivisionError as msg:
    ## 出错之后执行的代码块
    print(msg)

else:
    ## 没有出错的代码块
    print('没有出错了')
finally:
    ## 不管有没有出错,都会执行
    print('出错了')


## 用一个try可以捕获多个不同类型的异常

10.2 使用 Exception处理所有错误

try:
    print(b)
except Exception as result:
    print(result)
else:
    print('出错了')
finally:
    print('出错了')

10.3在合适的层次去捕获

def A(s):
    return s/int(s)
    pass


def B(s):
    return A(s)/2
    pass


def main():
    try:
        B(0)
    except Exception as result:
        print(result)

main()

在合适的位置进行错误捕获


division by zero


10.4 异常运行机制

1、解释器会查找相应的异常捕获类型
2、不断传递给上层,没有找到异常处理,会退出

11.自定义异常类型


class ToolongException(Exception):
    def __init__(self, len):
        self.len = len

    def __str__(self):
        return '输入的长度是'+str(self.len)+'长度,超出长度了'

def name_test():
    name = input('输入名字')
    try:
        if len(name)>5:
            raise ToolongException(len(name))
        else:
            print(name) 
    except ToolongException as result:
        print(result)
    else:
        print('没有出错了')


name_test()

##输入的长度是13长度,超出长度了

12 动态添加属性和方法



import types

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        pass
    pass

    def __str__(self):
        return '{}今天{}岁了'.format(self.name, self.age)
        pass
    pass


zhz = Student('詹躲躲', 25)
zhz.wight = 60


def dymicMethod(self):
    print('{}体重是{}'.format(self.name,self.wight))
    pass

## 动态添加属性
print(zhz.wight)

## 类添加属性
Student.pro = '计算机科学'
## 实例可以访问
print(zhz.pro)

## 动态添加实例方法
## import types
zhz.printInfo = types.MethodType(dymicMethod,zhz)
zhz.printInfo()

## 詹躲躲体重是60

13 动态绑定类方法


import types

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        pass
    pass

    def __str__(self):
        return '{}今天{}岁了'.format(self.name, self.age)
        pass
    pass


zhz = Student('詹躲躲', 25)
zhz.wight = 60


def dymicMethod(self):
    print('{}体重是{}'.format(self.name,self.wight))
    pass

## 动态绑定类方法
@classmethod
def classTest(cls):
    print('类方法')
    pass

## 动态绑定静态方法
@staticmethod
def staticTest():
    print('静态方法')
    pass

13.1.动态添加属性

print(zhz.wight)

13.2.类添加属性

Student.pro = '计算机科学'
## 实例可以访问
print(zhz.pro)

13.3.动态添加实例方法

## import types
zhz.printInfo = types.MethodType(dymicMethod,zhz)
zhz.printInfo()

13.4.动态绑定类方法

Student.testMethod = classTest
Student.testMethod()

13.5.动态绑定类方法 实例调用

zhz.testMethod()

13.6.动态绑定静态方法

Student.statictest = staticTest
Student.statictest()

13.7.动态绑定静态方法 实例调用

zhz.statictest()

14.slots属性


class Student(object):
    __slots__ = ('name', 'age', 'score')

    def __str__(self):
        return "{},{}".format(self.name, self.age)

xw = Student()
xw.name = '叫我詹躲躲'
xw.age = 25
## print(xw.__dict__)
## {'name': '叫我詹躲躲', 'age': 25}

xw.s11  = '1212'

#### 报错
print(xw)

子类未声明 slots,不会继承父类的slots,此时子类可以随意的属性赋值


子类声明了,范围为 子类+父类的范围


15.题目练习 一


15.1 python new的方法和作用是什么?


用来创建实例对象,只有继承了object的话,才有这个方法。


15.2 什么是单例模式,适用于什么场景?


要求一个类有且只有一个实例,并且提供了全局的访问点。日志插入logger,网站计数器,权限验证模块,window资源管理器,系统回收站,数据库连接池


15.3 私有化方法和私有化属性在子类中能否继承?


不能的


15.4 在python中什么是异常?


程序在执行中出现的异常。


15.5 python中如何处理异常?


分别根据异常的类型去处理


15.6 python中异常处理的一般格式,可以使用伪代码描述?

##  try:
##     正常操作
## except:
##     ##....
## else:
##     ##....
## finally:

##     ##...

15.7 slots的作用


限制属性的随意输入,节省内存空间


15.8 私有化的属性的作用?


保护数据,封装性的体现


15.9 在类外是否修改私有属性?


不可以直接修改,通过方法去实现,可以借助property


15.10 如果一个类,只有指定的属性或者方法能被外部修改,该如何限制?


对属性进行私有化


16 题目练习二


16.1 定义一个person类,类中要有初始化方法,方法中要有人名,年龄两个私有属性


提供获取用户信息的函数,提供设置私有属性的方法,设置年龄在0-120岁中间,如果不在这个范围,不能设置成功

class Person:
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
        pass
    pass

    def GetUserInfo(self):
        return "{}的年龄为{}".format(self.__name,self.__age)
        pass
    pass

    def __str__(self):
        return "{}的年龄为{}".format(self.__name,self.__age)

    def setAge(self,age):
        if age>0 and age<120:
            self.__age = age
        else:
            pass
        
person = Person('詹躲躲',19) 
print(person.GetUserInfo())
## 詹躲躲的年龄为19

print(person.setAge(30))
print(person.GetUserInfo())
## 詹躲躲的年龄为30

16.2 请写一个单例模式

class DataBaseClass(object):
    def __new__(cls,*args,**kwargs):
        ## cls._instance = cls.__new__(cls) ##不能使用自己的new方法
        if not hasattr(cls,'_instance'):
            cls._instance = super().__new__(cls,*args,**kwargs)
        return cls._instance
        pass
    pass

db1 = DataBaseClass()
db2 = DataBaseClass()
db3 = DataBaseClass()
print(id(db1))
print(id(db2))
print(id(db3))

16.3 创建一个类,并定义两个私有化属性,提供一个获取属性的方法。利用property属性给调用者提供调用

class Student:
    def __init__(self, name, score):
        self.__name = name
        self.___score = score

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    def __str__(self):
        return self

    def __call__(self, *args, **kwargs):
        print(self.name)
        pass
    pass

xm = Student('詹躲躲',98)
xm.__call__()

xm.name()

16.4 创建一个Animal类。实例一个cat对象,给cat 绑定一个run方法,给类绑定一个类属性color

import types
class Animal:
    pass

def run(self):
    print('小猫')

cat = Animal()
cat.run = types.MethodType(run,cat)
cat.run()

Animal.color = 'red'
print(cat.color)

def info():
    print('ok')

Animal.info = info
Animal.info()
相关文章
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1340 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
9月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
263 4
|
9月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
10月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
871 3
|
人工智能 C# Python
处理python异常
本文介绍了Python中的异常处理机制,并实现了一个简单的异常装饰器。通过`try/except`语句捕获异常,结合`finally`子句完成清理工作。为进一步优化代码结构,文章提出了使用装饰器处理异常的方法,避免函数中大量冗长的异常处理语句。通过类封装异常装饰器,多个函数可共享异常处理逻辑,提升代码简洁性和可维护性。总结强调了装饰器在异常处理中的优势,使代码更加优雅高效。
285 27
|
10月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
261 0
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
626 15
如何处理python的常见异常问题
在Python语言中,python异常处理机制主要依赖try、except、else、finally和raise五个关键字。本篇文章将为大家详细讲解一下如何处理python的常见异常问题。
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
536 5
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
356 11

推荐镜像

更多