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

简介: ## 封装,继承和多态## 1.封装1、满足把内容封装到某个地方,另一个地方去调用封装的内容2、使用初始化构造方法,或者使用self获取封装的内容## 2.继承子类继承父类的属性和内容

6.私有化



6.1 私有化属性


## 私有属性 以__开头,声明为属性私有,不能在类的外部被使用或者直接访问。
class Person(object):
    def __init__(self):
        self.__name = '叫我詹躲躲' ## 私有化
        self.age = '21'
    pass
    def __str__(self):
        return '{}的年龄是{}'.format(self.__name,self.age)
person = Person()
## print(person.__name) ##报错
print(person) ##可以访问
## 叫我詹躲躲的年龄是21
## 私有属性,不能被子类继承


6.2私有化方法


class A(object):
    def __eat(self):
        print('吃饭')
        pass
    pass
    def run(self):
        print('跑步')
        pass
    pass
b = A()
b.__eat() ## 报错
b.run() ## 跑步


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
相关文章
|
5月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
425 0
|
6月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
213 4
|
6月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
7月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
713 3
|
7月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
198 0
|
11月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
534 15
|
11月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
422 5
|
安全 测试技术 数据库
Python编程--sys模块及OS模块简单用例
Python编程--sys模块及OS模块简单用例
244 1
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
146 1
|
数据处理 Python
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
288 1