面向对象进阶小结

面向对象进阶小结

一、面向对象进阶小结

面向对象最本质解决的问题就是:提供可扩展性

类与对象:程序中必须现有类,再有对象

类中有属性,有方法

绑定方法:定义在类内部,没有装饰器装饰的方法都是对象的绑定方法,需要对象来调用,对象调用的时候,会把自身传入

1.1 类的继承

继承父类,则会有父类的所有属性和方法

class ParentClass1():
    pass

class ParentClass2():
    pass

class SubClass(ParentClass1,ParentClass2):
    pass

1.2 类的派生

继承父类的同时自己有init,然后也需要父类的init

class ParentClass1():
    def __init__(self,name):
        pass

class SubClass(ParentClass):
    def __init__(self,age):
        # 1. ParentClass1.__init__(self,name)
        # 2. super(SubClass,self).__init__(name)
        self.age = age  

指名道姓,使用类名

super().方法/属性 super严格按照mro列表查找,super(类名,对象)python2/3

1.3 类的组合

类对象可以引用/当做参数传入/当做返回值/当做容器元素,类似于函数对象

class ParentClass1():
    count = 0
    def __init__(self,name):
        pass

class SubClass(ParentClass):
    def __init__(self,age):
        self.age = age  

pc = ParentClass1()
sc = SubClass()

sc.parent_class = pc  # 组合
sc.parent_class.count  # 0

1.4 菱形继承问题

新式类:继承object的类,python3中全是新式类

经典类:没有继承object的类,只有python2中有

在菱形继承的时候,新式类是广度优先(老祖宗最后找);经典类深度优先(一路找到底,再找旁边的)

1.5 多态与多态性

多态:一种事物的多种形态,动物-->人/猪/狗

多态性:同一个函数调用,可以实现不同的功能

# 多态
import abc

class Animal(metaclass=abc.ABCmeta):
    @abc.abstractmethod
    def eat():
        print('eat')

class People(Animal):
    def eat():
        pass

class Pig(Animal):
    def eat():
        pass
    def run():
        pass

class Dog(Animal):  # 报错
    def run():
        pass

# 多态性
peo = People()
peo.eat()
peo1 = People()
peo1.eat()
pig = Pig()
pig.eat()

def func(obj):
    obj.eat()

class Cat(Animal):
    def eat():
        pass
cat = Cat()

func(cat)

鸭子类型:只要长得像鸭子,叫的像鸭子,游泳像鸭子,就是鸭子.

控制子类必须实现父类的方法,abc模块,和通过异常

1.6 类的封装

隐藏属性,只有类内部可以访问,类外部不可以访问

封装
组合也是属于封装,
隐藏属性和方法
通过__两个下划线,放在属性或者方法的前面,能把属性和方法隐藏
隐藏属性的目的,就是为安全
隐藏方法的目的就是为了隔离复杂性

class Foo():
    __count = 0 

    def get_count(self):
        return self.__count

f = Foo()
f.__count  # 报错
f._Foo__count # 不能这样做

1.7 类的property特性

把方法变成属性引用

propetory:把方法包装成数据属性
修改 @方法名.setter
删除 @方法名.deleter

class People():
    def __init__(self,height,weight):
        self.height = height
        self.weight = weight

    @property
    def bmi(self):
        return weight/(height**2)

    @bmi.setter
    def bmi(self,value)
        print('setter')

    @bmi.deleter
    def bmi(self):
        print('delter')

peo = People
peo.bmi

1.8 类与对象的绑定方法和非绑定方法

没有任何装饰器装饰的方法就是对象的绑定方法, 类能调用, 但是必须得传参给self

被 @classmethod 装饰器装饰的方法是类的绑定方法,参数写成cls, cls是类本身, 对象也能调用, 参数cls还是类本身

被 @staticmethod 装饰器装饰的方法就是非绑定方法, 就是一个普通的函数

原文地址:https://www.cnblogs.com/randysun/p/12250342.html

时间: 2024-11-11 04:28:45

面向对象进阶小结的相关文章

Python之路【第八篇】:Python基础(24)——面向对象进阶

参考连接: Python 面向对象(初级篇) http://www.cnblogs.com/wupeiqi/p/4493506.html python 面向对象(进阶篇) http://www.cnblogs.com/wupeiqi/p/4493506.html python 面向对象及相关 http://www.cnblogs.com/wupeiqi/articles/5017742.html 面向对象进阶: 类成员之字段.方法.属性: 类成员修饰符: 类成员之特殊成员 1.类方法 普通的方法

2Python全栈之路系列之面向对象进阶及类成员

Python全栈之路系列之面向对象进阶及类成员 再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:     def bar(self):         print("BAR")         self.f1()          class B(A):     def f1(self):         print("B")          class C:     def 

Python【day7】:Python学习(面向对象进阶、反射、socket介绍)

面向对象进阶 1.类变量和实例变量 # 一.变量 # 变量包括:实例变量和类变量, # 他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, # 实例变量属于对象 # 类变量属于类 class Province(object): country = "中国" #类变量 def __init__(self, name): self.name = name # 实例变量 # 直接访问实例变量(实例名来调用) obj = Province('河北省') print(obj.na

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

python面向对象进阶版

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个'函数'供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存

10、python全栈之路-面向对象进阶

十.面向对象进阶 http://www.cnblogs.com/Eva-J/articles/7351812.html 1.isinstance和issubclass 1.1 isinstance(obj,cls) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1.2 issubclass(sub, super) issubclass(sub, super)检查sub类是否是 super 类的派生类 2.反射 #把一个字符串数据类型的变量变成一个真实存在在这个程序

python(24)- 面向对象进阶

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个‘函数’供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存

Python之面向对象进阶

Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 1.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 1 class Province:

Python基础-面向对象进阶

面向对象进阶 一 类中的装饰器方法  classmethod staticmethod property 1.1 property 一般情况下,方法都是动词.指某一类事物的动作 在计算圆形的周长和面积的时候,他们应该是圆形的属性,但是这里确是一个方法.这不符合python面向对象(能够完全区分属性和方法)的理念. 所以我们可以用一个装饰器去将一个属性性质的函数,装饰成一个属性.可以以调用属性的方式去调用他. from math import pi class Circle: def __init