python面对对象

中间隔有python模块没有进行更新,是因为觉得模块的操作应用更应该记牢,再次先不更新

1,面对对象的作用: 能简化思路和代码

  
2,面对对象的思路:
  不着急直接去计算/操作代码获取结果
  从一个大的问题中,要到要描述的角色
  将角色的属性和行为抽象出来
  形成一个模子
  后期用到角色的时候,都围绕这个模子来操作。
3,类 :一类抽象的事物,是描述了一类事物有哪些属性或者行为,但是不具体。
4,实例:就是一个依托于类的规范存在的,被赋予了具体属性值得实际存在的物体
5,对象 :就是实例--给类中约束的属性赋了具体的值
实例化: 由一个类产生一个对象/实例的过程。 创建对象的过程 对象=类名()
    #1,创建一个对象 产生一些类对象指针
    #2,调用init方法,将创造的对象传给self,执行init方法
    #3,将self自动的返回给调用者
创造一个函数:用def(开头用小写)
创造一个类:用class(一般开头要用大写)

class Person: 这个整体就是类
  country = ‘China’#静态属性
  def func(self):
    print(123)
  def aaa(self):
Person 是一个类名Person()#这就是对象

Person 中可以放两个东西(类中可以定义的):
  静态属性:就是变量--是所有的对象共享的一个属性
  动态属性(方法):就是函数 自带一个叫做self的形参 特殊的__init__方法
类中写的所有的静态属性和动态属性都是所有对象共享的。
在self空间中或者是在实例化之后的对象的空间中定义的变量都是属于某个对象的
类名可以做两件事情:
  查看静态属性和动态属性
  创造一个对象 也就是实例化
对象:调用方法 查看对象命名空间中的属性

class Person:
    Country = ‘China‘
    def func(self):
        print(123)
    def __init__(self,name,sex,hp,ad):
        print()

print(Person.Country)  #通过.连接其中的元素
print(Person.func)
Person.func(0)   #使用Person调用方法的时候 self也是一个需要传的参数
print(Person.__dict__) #内置的一个字典  将变量和函数存进去

    #创造一个对象:对象 = 类名+()
        #首先要创造一个对象
        #会自动的触发__init__函数,将创造出来的对象的地址创给self(self和obj是同一个东西)
        #执行init中的代码
        #将self指向的地址再返回给调用者
obj = Person(‘alex‘,None,10,1) #会自动化执行 def __init__(self):

对象名可以调用静态属性

class Person:
    Country = ‘China‘
    def __init__(self,name):
        self.name=name
    def attack(self):
        print(‘attack‘)

alex = Person(‘alex‘)
egon = Person(‘egon‘)
alex.Country = ‘印度‘ #往Alex的对象内存中存了一个印度()
print(alex.Country)    #印度
print(egon.Country)    #China
print(Person.Country)  #China

class Person:
    Country = [‘China‘]
    def __init__(self,name):
        self.name=name

alex = Person(‘alex‘)
egon = Person(‘egon‘)

alex.Country[0] = ‘印度‘
print(alex.Country)  #印度
print(egon.Country)  #印度
print(Person.Country) #印度总结:如果是对静态属性赋值,那么会在对象空间里创造一个 如果是像列表一样更改 那么会先去找类空间找,找不到则再创造。

首先静态变量之所以出现:所有的对象都共享的值
调整静态变量的值:直接用类名去调整,是最准确的
对象对一个静态变量重新赋值的过程,实际上是在对象所在的内存空间中 添加一个个同名属性而已
方法并没有真正存储在对象的空间中,之所有能找到,是因为每一个对象在创建之初都有一个执行类的指针。

类名:
  查看修改静态属性
  实例化
对象名:
  查看对象的属性
  调用方法
对象使用名字的特点:自已有的时候用自己的,自己没有的时候用类的

静态属性和对象属性的区别是什么?
  如果所有的对象的某一个值都是相同的,就用静态属性
  如果所有的对象的某一个值都是不同,就用对象属性

************************************组合**************************************
组合:两个类的事儿
关系:一个类有另一个类 比如人有武器
  一个类的对象作为另一个类对象的属性
武器类的对象作为人类对象的一个属性

class Person:
    def __init__(self,name,sex,hp,ad):
        self.name = name
        self.sex=sex
        self.hp=hp
        self.ad=ad
    def attack(self,dog):
        dog.hp -= self.ad

class Dog:
    def __init__(self,name,kind,hp,ad):
        self.name = name
        self.kind=kind
        self.hp=hp
        self.ad=ad
    def bite(self,person):
        person.hp -= self.ad

class Weapon:
    def __init__(self,name,price,ad=0,hp=0):
        self.name = name
        self.price = price
        self.ad = ad
        self.hp = hp
        self.ad_total = self.ad #人和武器的攻击力总和

    def Kill(self,dog):
        dog.hp -= self.ad_total

alex = Person(‘alex‘,None,50,1)
taibai = Dog(‘哮天犬‘,‘teddy‘,200,30)
alex.attack(taibai)
print(taibai.hp)

板儿砖 =Weapon(‘打狗砖‘,998,190)
print(板儿砖.__dict__)
alex.weapon = 板儿砖
alex.weapon.Kill(taibai)
print(taibai.hp)

学生与课程组合

课程类的对象作为学生对象的一个属性

class Student:
    def __init__(self,name,sex,age,number,course):
        self.name = name
        self.sex = sex
        self.age = age
        self.number = number
        self.course = course

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

python = Course(‘python‘,‘6 months‘,20000)

xiaoming = Student(‘小明‘,‘male‘,18,10086,python)
xiaoming.course.name
print(xiaoming.course.name)
print(xiaoming.course.period)
print(xiaoming.course.__dict__)

圆和圆环组合:圆形类的对象作为圆环对象的一个属性

from math import pi
print(pi)
class Circle: #目的是规范一个圆
    def __init__(self,r):
        self.r = r
    def perimeter(self):
        return pi*2*self.r
    def area(self):
        return pi*self.r**2

class Ring:
    def __init__(self,out_r,in_r):
        self.out_circle = Circle(out_r)
        self.in_circle = Circle(in_r)
    def peri(self):
        return self.out_circle.perimeter() + self.in_circle.perimeter()
    def are(self):
        return self.out_circle.area() - self.in_circle.area()

r = Ring(10,5)
print(r.peri())
print(r.are())

圆的创建

*************面对对象的三大特性***************
python重要的是继承和封装
    继承
    多态
    封装

#继承的作用:
#代码的重用性以及两种继承方法:

class Role:
    def __init__(self,name,hp,ad):
        print(‘in Role init‘)
        self.name = name
        self.hp=hp
        self.ad=ad
class Person(Role):
    def __init__(self,name,sex,hp,ad):
        self.sex = sex           #派生属性(父类没有)
        #Role.__init__(self,name,hp,ad)  #指名道姓--继承
        #super().__init__(name,hp,ad)  #super()直接代表父类,不用传self
        super(Person,self).__init__(name,hp,ad) #super中有默认参数写不写都可以

    def attack(self,dog):        #派生方法(父类没有)
        dog.hp -= self.ad
class Dog(Role):
    def bite(self,person):
        person.hp -= self.ad
alex = Person(‘alex‘,None,100,1)
print(alex.__dict__)


#如果我自己的类里面也有一个init 先执行类里面的init
#继承的语法:在子类定义的时候括号里加上父类的名字
#对象在寻找名字的时候,先找自己对象空间里的-->再找自己的类的空间里的-->再找父类空间的
#在自己的类中调用父类中的同名方法:

          1)指名道姓(需要自己传self参数)

          2)super方法(不需要自己传self参数)

检测继承关系学的怎么样d的一个方法:

class Foo:
    def __init__(self):   #父类中的self是下面Foo类中的self,可以这样理解
        self.func()
    def func(self):
        print(‘in foo‘)

class Son(Foo):
    def func(self):
        print(‘in son‘)

Son()

继承:什么是什么的关系
  节省两个类之间共有的方法或者代码
  如果子类和父类一样 那么可以省略子类的 用父类的
  如果是子类特有的,用子类的---派生
  如果两个方法,子类也有父类也有,用子类的
  如果两个方法,子类也有父类也有,想用父类的:指名道姓,super

#抽象类和接口类---了解
#钻石继承--新式类 和 经典类--(python程序员需要了解的)。
主要就是维持了一种规范
python中 一切皆对象

dic = {‘k‘:‘v‘}
lst = [1,2,3]
len(dic)
print(dic.__len__()) #len是个对象 先这样理解吧

def len(dic):
    return dic.__len__()

********************************************抽象类**********************************************

from abc import ABCMeta,abstractmethod  #记住这个

class Pay(metaclass=ABCMeta):
    @abstractmethod
    def pay(self,money):pass  #目的是为了规范
#抽象类:
    #在类的位置指定metaclass 是ABCMeta
    #在指定的方法上面添加@abstractmethod 装饰器
#目的:规范所有继承这个类的子类,必须实现被@abstractmethod 装饰器 装饰的这个方法
#特点:抽象类和接口类不能被实例化
class Wechatpay:
    def pay(self,money):
        print(‘微信支付了%s元‘ %money)

class Alipay:
    def pay(self,money):
        print(‘支付宝支付了%s元‘ %money)

class Applepay:
    def fuqian(self,money):  #里面的fuqian必须是pay才行
        print(‘apple支付了%s元‘ %money)

def payment(obj,money):
    obj.pay(money)

wp = Wechatpay()
#wp.pay(100)
payment(wp,100)        #编程习惯---归一化设计
ap = Alipay()
#ap.pay(100)
payment(ap,100)    

app = Applepay()   #会报错 因为Applepay里面的方法是fuqian 不是pay
payment(app,100)  

****************************************************接口类*****************************************************
接口类:python天生支持多继承 java语言是不支持多继承的
python支持多继承,对于python来说抽象类和接口类没有区别
接口类是python特有的,因为python直接用类就可以实现接口的效果
python没有‘接口’这种数据类型,Java中有

from abc import ABCMeta,abstractmethod
class Walk_Animal(metaclass=ABCMeta):  #接口隔离:使用多个专门的接口,而不使用单一的总接口,即客户端不应该用那些不需要的接口
    @abstractmethod
    def walk(self):pass
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):pass
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):pass

class Tiger(Walk_Animal,Swim_Animal):#老虎只会走和游泳,所以用不着飞的规范
    def walk(self):
        print(‘walk‘)
    def swim(self):
        print(‘swim‘)

class Parrot:
    def walk(self):
        print(‘walk‘)
    def fly(self):
        print(‘fly‘)

class Swan:
    def walk(self):
        print(‘walk‘)
    def fly(self):
        print(‘fly‘)
    def swim(self):
        print(‘swim‘)

依赖倒置原则:
高层 模块不应该依赖底层模块,二者 都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象,换言之,要针对接口编程,而不是针对实现编程。

#钻石继承 :4个类图形(也可以增加)就是形状像钻石 其实就是多继承
#D-B-C-A
#找一个名字,如果这个名字在子类不存在,就会遵循一个顺序往上找
#继承关系会形成一张图,每一个类都是这个图中的节点,寻找顺序会把图中的每个节点都找一遍且只找一次
------遍历算法
python3里面的所有类都是新式类
新式类的遍历算法遵循---广度优先规律

class A:
    def func(self):print(‘in a‘)
class B(A):pass
    #def func(self):print(‘in b‘)
class C(A):
    def func(self):print(‘in c‘)
class D(B,C):pass
    #def func(self):print(‘in d‘)

d = D()
d.func()

原文地址:https://www.cnblogs.com/xiao-xuan-feng/p/12228316.html

时间: 2024-11-08 01:41:39

python面对对象的相关文章

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

Python - 面对对象(基础)

目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程(Object Oriented Programming,OOP,面向对象程序设计) 最易被初学者接受,其往往用一长段代码来实现指定功能,开发

15、python面对对象之类和对象

前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真实存在的,描绘了该类事物共有的特征和行为 例如:猫类.狗类.鸟类.车类等 实例对象:某类事物的具体个体,是该类事物的具体表现,它是真实存在的 例如:“张三”是具体的某个“人“,”二哈“是具体的某个”狗“ 二.类的定义 关键字:class 定义类的方法: 方式一:class 类名: 方式二:class

16、python面对对象之类和继承

前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法 (不能传递实例属性和实例方法),跟实例方法的self用法相似. 2.类方法的调用 实例对象和类对象都可以调用 3.应用场景 在需要站在类的角度执行某个行为时,那么就可以定义为类方法 class Student: def __init__(self,

python面对对象笔记整理

首先声明本文纯属笔记 1 面对对象三大特性: 1.1 封装:将字段封装在类中,通过类中self调用或者通过对象来调用. 1.2 继承:一般的继承不再叙述,多继承参考另一篇文章 python多继承 1.3 多态:因为python的函数可以传入多种类型的参数,所以不存在多态.python这种形式属于鸭子类型,也就是长得像鸭子的类型都可以. 2

Python 面对对象编程

面向对象编程: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对

python面对对象编程-------5:获取属性

一:最基本的属性操作 1 class Generic: 2 pass 3 4 g= Generic() 5 6 >>> g.attribute= "value" #创建属性并赋值 7 >>> g.attribute 8 'value' 9 >>> g.unset 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in &l

Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)

一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __init__(self): print('B') obj = A() #虽然只是创建了obj对象,但是执行了__init__方法,输出了A Python中派生类可以继承父类的构造方法 1.基于super() 遇到super()就表示去执行父类的xxx属性 class A: def __init__(

python面对对象编程

基本概念 class类 一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同 Encapsulation 封装在类中对数据的赋值.内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的