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

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

1.单继承



## 封装,继承和多态

## 1.封装


1、满足把内容封装到某个地方,另一个地方去调用封装的内容

2、使用初始化构造方法,或者使用self获取封装的内容


## 2.继承


子类继承父类的属性和内容


1.1单继承示例


class Animal:
    def eat(self):
        print('吃饭了')
        pass
    def drink(self):
        print('喝水了')
        pass
class Dog(Animal):
    def wwj(self):
        ## 子类独有的实现
        print('小狗汪汪叫')
        pass
class Cat(Animal):
    def mmj(self):
        ## 子类独有的实现
        print('小猫喵喵叫')
        pass
d1 = Dog()
d1.eat()
d2 = Cat()
d2.eat()


## 总结:所以对于面向对象的继承来说,可以极大的提升效率,减少重复代码


2.多继承


class Shenxian:
    def fly(self):
        print('神仙会飞')
    pass
class Monkey:
    def chitao(self):
        print('猴子喜欢吃桃')
    pass
class Sunwukong(Shenxian,Monkey):
    pass
swk = Sunwukong()
swk.fly()
swk.chitao()


2.1 注意方法重名:


## 多个父类存在相同的方法,该调用哪一个

class D(object):
    def eat(self):
        print('D.eat')
    pass
class C(object):
    def eat(self):
        print('C.eat')
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.eat
print(A.__mro__) ##显示类的继承顺序
<class '__main__.A'>,
<class '__main__.B'>,
<class '__main__.D'>,
<class '__main__.C'>,
<class 'object'>


## 执行顺序应该是 去A里面查找,找第一个父类,A中没有的话,去B中查找,,B类中没有,C类中没有,去D类中查找;


2.2案例 简洁继承


class D(object):
    def eat(self):
        print('D.eat')
    pass
class C(object):
    def eat(self):
        print('C.eat')
    pass
class B(D):
    pass
class A(B,C):
    pass
a = A()
a.eat
print(A.__mro__) ##显示类的继承顺序
<class '__main__.A'>,
<class '__main__.B'>,
<class '__main__.D'>,
<class '__main__.C'>,
<class 'object'>


2.3重写父类方法


class Grandfather():
    def eat(self):
        print('吃的方法')
        pass
    pass
class Father(Grandfather):
    ## 覆盖了父类的方法
    def eat(self):
        print('爸爸经常吃海鲜')
    pass
class Son(Father):
    pass
son = Son()
print(Son.__mro__)


## 定义跟父类相同的方法,可以实现覆盖和重写父类的方法


2.4重写初始化方法


class Grandfather():
    def __init__(self,name):
        self.name = name
        pass
    def eat(self):
        print('吃的方法')
        pass
    pass
class Father(Grandfather):
    def __init__(self):
        pass
    ## 覆盖了父类的方法
    def eat(self):
        print('爸爸经常吃海鲜')
    pass
class Son(Father):
    pass
son = Son()
print(Son.__mro__)


2.5调用父类初始化方法


class Father:
    def __init__(self,name):
        self.name = name
        pass
    ## 覆盖了父类的方法
    def eat(self):
        print('爸爸经常吃海鲜')
    pass
class Son(Father):
    def __init__(self,name):
        Father.__init__(self,name) ##调用父类的方法,可以具备name属性
        ## 或者
        ## super.__init__(name) ##也可以这样写
        self.age = 90 ## 添加新的实例方法
        self.sex = '男'
        pass
    pass
son = Son('hello')


2.6 调用父类的方法


class Father:
    def __init__(self,name):
        self.name = name
        pass
    ## 覆盖了父类的方法
    def eat(self):
        print('父类的吃方法')
    pass
class Son(Father):
    def __init__(self,name):
        Father.__init__(self,name) ##调用父类的方法,可以具备name属性
        ## 或者
        ## super.__init__(name) ##也可以这样写
        self.age = 90 ## 添加新的实例方法
        self.sex = '男'
        pass
    pass
    def __str__(self):
        print('{}'.format(self.name))
        pass
    def eat(self):
        super().eat() ##调用父类的方法
        print('子类的吃方法')
        pass
son = Son('詹躲躲')
son.eat()
## 父类的吃方法
## 子类的吃方法


3 多态



同一种行为,对于不同子类【对象】有不同的实现方式


3.1 要想实现多态,必须有两个前提


1.继承:发生在父类和子类之间

2.重写:子类重写父类的方法

3.1 案例演示

class Animal:
    ## 基本类
    def say(self):
        print('动物类')
        pass
    pass
class Duck(Animal):
    ## 子类 派生类
    def say(self):
        print('鸭子类')
        pass
    pass
class Dog(Animal):
    ## 子类 派生类
    def say(self):
        print('小狗类')
        pass
    pass
## duck1 = Duck()
## duck1.say()
## dog = Dog()
## dog.say()
def commonIvoke(obj):
    ## 统一调用
    obj.say()
## 循环统一调用
listObj = [Duck(),Dog()]
for item in listObj:
    commonIvoke(item)
## 在定义时的类型跟调用时不一样的时候,称为多态。


3.2 多态的好处


1.增加程序的灵活性

2.增加程序的扩展性


4.类属性和实例属性



class Animal:
    ## 基本类
    def say(self):
        print('动物类')
        pass
    pass
class Duck(Animal):
    ## 子类 派生类
    def say(self):
        print('鸭子类')
        pass
    pass
class Dog(Animal):
    ## 子类 派生类
    def say(self):
        print('小狗类')
        pass
    pass
## duck1 = Duck()
## duck1.say()
## dog = Dog()
## dog.say()
def commonIvoke(obj):
    ## 统一调用
    obj.say()
## 循环统一调用
listObj = [Duck(),Dog()]
for item in listObj:
    commonIvoke(item)
## 在定义时的类型跟调用时不一样的时候,称为多态。


5.类属性和静态方法


class Animal:
    ## 基本类
    def say(self):
        print('动物类')
        pass
    pass
class Duck(Animal):
    ## 子类 派生类
    def say(self):
        print('鸭子类')
        pass
    pass
class Dog(Animal):
    ## 子类 派生类
    def say(self):
        print('小狗类')
        pass
    pass
## duck1 = Duck()
## duck1.say()
## dog = Dog()
## dog.say()
def commonIvoke(obj):
    ## 统一调用
    obj.say()
## 循环统一调用
listObj = [Duck(),Dog()]
for item in listObj:
    commonIvoke(item)
## 在定义时的类型跟调用时不一样的时候,称为多态。


5.1 静态方法


class Person:
    country = 'china'
    ## 类方法 用classmethod修饰
    @classmethod
    def get_country(cls):
        return cls.country ## 访问类属性
        pass
    @classmethod
    def change_country(cls):
        cls.country = 'America'
        pass
    @staticmethod
    def get_data():
         return Person.country
    pass
## 通过类对象去引用
print(Person.get_country())
print(Person.change_country())
print(Person.get_country())
print(Person.get_data())

一般不会通过是实例对象去访问静态方法


由于静态方法主要存放逻辑方法,本身与类以及实例没有交互,也就是不会涉及类中方法和属性的操作


根据资源能够有效的利用


5.2求系统当前的时间


import time
class sys_time:
    def __init__(self,hour,min,second):
        self.hour = hour
        self.min  =min
        self.second = second
    @staticmethod
    ## 独立的功能
    def show_time():
        return time.strftime('%H:%M:%S',time.localtime())
print(sys_time.show_time())
## 15:15:44


5.3 总结


1.类方法的第一个参数是类对象,cls进而去引用类对象的属性和方法


2.实例方法的第一个参数是实例属性,若存在相同的实例属性或者方法,实例属性优先级最高


3.静态方法不需要额外的参数,若需要引用属性。,则可以通过类对象或者实例对象去引用即可,必须使用装饰器@staticmethod装饰



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

推荐镜像

更多