一、类命名空间与对象、实例的命名空间

   常见一个类就会创建一个类的名称空间,用来储存类中定义的所有名字,这些名字成为类的属性

 而类有两种属性:静态属性和动态属性

  • 静态属性就是直接在类中定义的变量
  • 动态属性就是定义在类中的方法

 创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

面相对象的组合用法:

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

class Weapon:
def prick(self, obj): # 这是该装备的主动技能,扎死对方
obj.life_value -= 500 # 假设攻击力是500 class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人 def __init__(self, name):
self.name = name # 每一个角色都有自己的昵称;
self.weapon = Weapon() # 给角色绑定一个武器; egg = Person('egon')
egg.weapon.prick()
from  math  import pi
class Circular:
def __init__(self,radius):
self.radius=radius
def area(self):
return self.radius **2 * pi
def perimeter(self):
return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter())

圆的面积和周长


class 正方形:
def __init__(self,length_of_side):
self.length_of_side = length_of_side def square(self):
'面积'
return self.length_of_side * self.length_of_side def perimeter(self):
'周长'
return self.length_of_side * 4 正方形2 = 正方形(2)
print(正方形2.square())
print(正方形2.perimeter())

正方形的面积周长

from  math  import pi
class Circular:
def __init__(self,radius):
self.radius=radius
def area(self):
return self.radius **2 * pi
def perimeter(self):
return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter()) class Ring:
def __init__(self,outside_radius,inside_radius):
self.outside_circular=Circular(outside_radius)
self.inside_circular=Circular(inside_radius)
def area(self):
return self.outside_circular.area()-self.inside_circular.area()
def perimeter(self):
return self.outside_circular.perimeter()+self.inside_circular.perimeter()
ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area())

圆环类的面积周长

二、用组合的方式建立了类与组合的类之间的关系

#老师 课程 生日
class Course:
def __init__(self,name,period,price):
self.name = name
self.period = period
self.price = price class Birth:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day class Teacher:
def __init__(self,name,salary,boy_friend,python):
self.name = name
self.salary = salary
self.bf = boy_friend
self.course = python python = Course('python','6 months',20000) egg = Teacher('egon',200,'yuan',python)
print(egg.bf)
print(egg.name)
print(egg.course.name) egg_birth = Birth(1965,2,2)
print(egg_birth.year)
egg.birth = egg_birth
print('***',egg.birth.year)

三、面向对象的三大特征

1、继承

class Animal:      #父类  基类  超类
def __init__(self,name,life_value,aggr):
self.name = name
self.life_value = life_value
self.aggr = aggr class Person(Animal): #子类 派生类
pass class Dog(Animal): #子类 派生类
pass egg = Person('egon',1000,50)
print(egg.name)
print(egg.aggr)
python2
class Dad: #经典类
class Dag(object) #新式类 python3
class Dad == class Dag(object) #新式类
class Animal:      #父类  基类  超类
def __init__(self,name,life_value,aggr):
self.name = name
self.life_value = life_value
self.aggr = aggr #攻击力
def eat(self):
self.life_value += 10 class Person(Animal): #子类 派生类
def __init__(self,money,name,life_value,aggr):
super().__init__(name,life_value,aggr)
self.money = money #派生属性 def attack(self,enemy): #人的派生方法
enemy.life_value -= self.aggr class Dog(Animal): #子类 派生类
def __init__(self,breed,name,life_value,aggr):
#Animal.__init__(self,name,life_value,aggr) #让子类执行父类的方法,就是父类名.方法名(参数),连self也得传
super().__init__(name,life_value,aggr) #super关键字——新式类
#super(Dog,self).__init__(name,life_value,aggr) #super关键字关键字——新式类
self.breed = breed
def bite(self,person): #狗的派生方法
person.life_value -= self.aggr def eat(self): # 父类方法的重写
super().eat()
print('dog is eating~~~ ') ha2 = Dog('牛头梗','旺财',20000,100)
print(ha2.life_value)
ha2.eat()
print(ha2.life_value)
# super(Dog,ha2).eat() #调用父类的
print(ha2.life_value)
在继承中
继承的语法:
class 类名(父类名):
想在子类中实现调用父类的方法
在类内 ——super(子类名,self).方法名()
在类外面 ——super(子类名,对象名).方法名()
如果不指定继承的父类,默认继承object
子类可以使用父类的所有属性和方法
如果子类有自己的方法就执行自己的的
如果是子类没有的方法就执行父类的
如果子类父类都没有这个方法就报错 继承、抽象、派生
继承 是从大范围到小范围
抽象 小范围到大范围
派生 就是在父类的基础上又产生子类——派生类
父类里没有的 但子类有的 ——派生方法
派生属性
方法的重写
父类里有的方法,在子类里重新实现
class A:
def hahaha(self):
print('A') class B(A):
def hahaha(self):
super().hahaha()
#super(B,self).hahaha()
#A.hahaha(self)
print('B') a = A()
b = B()
b.hahaha()
super(B,b).hahaha()

了解super


继承:

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)  

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义

     了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

from abc import ABCMeta,abstractmethod
class Payment(metaclass = ABCMeta): #metaclass --> 元类
@abstractmethod
def pay(self,money):pass class Applepay(Payment):
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay(Payment):
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s'%money) def payment(pay_obj,money):
pay_obj.pay(money) # apple1 = Applepay()
# ali1 = Alipay()
# wechat1 = Wechatpay()
# payment(wechat1,200)
接口类
约束继承接口类的子类必须实现被abstractmethod装饰的方法
在接口类中不要做实现
接口类不能被实例化
四、抽象类
抽象 : 从小范围到大范围
from abc import ABCMeta,abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def eat(self):
print('打开粮食的袋子')
print('放一个吃饭的碗')
print('把粮食倒在碗里') @abstractmethod
def sleep(self):
pass class Dog(Animal):
def eat(self):
super().eat()
print('dog is eating') def sleep(self):
print('dog is sleeping')
当几个子类的父类 有相同的功能需要被实现的时候 就用抽象类
当几个子类 有相同的功能 但是实现各不相同的时候 就用接口类
约束 接口类和抽象类在java里面的区别
接口类支持多继承
抽象类只支持单继承
class Animal:
def swim(self):
pass def fly(self):
pass def walk(self):
pass
from abc import ABCMeta,abstractmethod
class Fly_Animal(Animal,metaclass=ABCMeta):
@abstractmethod
def fly(self):pass class Swim_Animal(Animal,metaclass=ABCMeta):
@abstractmethod
def swim(self):pass class Walk_Animal(Animal,metaclass=ABCMeta):
@abstractmethod
def walk(self):pass class Dog(Walk_Animal,Swim_Animal):
def walk(self):pass
def swim(self):pass
def eat(self):pass
def sleep(self):pass class Parrot(Fly_Animal,Walk_Animal):
pass d = Dog()
抽象类
在Python里 默认是有的
父类的方法 子类必须实现
抽象类 不能被实例化
抽象类内的方法 可以被简单实现
接口类(在抽象类的基础上)
在python里 默认是没有的
接口类中的方法 不能被实现
原则:抽象类最好不要用多继承,而接口类可以
五、多继承
class A(object):
def test(self):
print('from A') class B(A):pass
# def test(self):
# print('from B') class C(A):
def test(self):
print('from C') class E(B):pass
# def test(self):
# print('from E') class F(C):pass
# def test(self):
# print('from F') class H:
def test(self):
print('from H') class I(H):
def test(self):
print('from I') class J(H):
def test(self):
print('from J') class D(E,F,I,J):pass
d = D()
d.test() print(D.mro())

六、多态性

多态指的是:一类实物有多种状态

class Animal:
# def eat(self):pass
#
# class Cat(Animal):pass
# class Dog(Animal):pass
# class Pig(Animal):pass
class Animal:pass

class Cat(Animal):
def eat(self):
print('cat eat') class Dog(Animal):
def eat(self):
print('dog eat') def eat_func(a):
a.eat()
c = Cat()
eat_func(c)
d = Dog()
eat_func(d)
python自带多态:
1 同一类事物的不同状态
2 操作的时候不需要关心这个对象的数据类型,只要去用就可以了
 
 
 
 

python之面向对象2的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  3. Python的面向对象2

    我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...

  4. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  5. My way to Python - Day05 - 面向对象-思维导图

    My way to Python - Day05 - 面向对象   思维导图

  6. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  7. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  8. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  9. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  10. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

随机推荐

  1. 为什么新生代内存需要有两个Survivor区

    转载自:http://blog.csdn.net/antony9118/article/details/51425581 在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? ...

  2. CentOS7 搭建Git服务器(转)

    1.在服务器上创建一个新用户 adduser git 2.创建一个Git仓库 cd /data/git //切换到希望创建工作区的目录git init --bare sample.git //创建一个 ...

  3. 20个开发人员非常有用的Java功能代码

    本文将为大家介绍20个对开发人员非常有用的Java功能代码.这20段代码,可以成为大家在今后的开发过程中,Java编程手册的重要部分. 1. 把Strings转换成int和把int转换成String ...

  4. JSP 页面传值方法总结

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 <a href=&quo ...

  5. 用Html模仿百度一下你就知道

    用Html模仿百度一下你就知道.... ------------------------------- <!doctype html> <html lang="en&quo ...

  6. php之数组

    数组分类: 1.索引数组. 索引值从0开始,依次递增. 2.使用array()函数声明数组 <?php // 1.直接为数组元素赋值即可声明数组 $contact_index[0] = 1; $ ...

  7. 调试大叔V1.0.1(2017.09.01)|http/s接口调试、数据分析程序员辅助开发神器

    2017.09.01 - 调试大叔 V1.0.1*支持http/https协议的get/post调试与反馈:*可保存请求协议的记录:*内置一批动态参数,可应用于URL.页头.参数:*可自由管理cook ...

  8. 【前端】Github Pages 与域名关联简明教程

    Github Pages 与域名关联简明教程 1. 向你的 Github Pages 仓库添加一个CNAME(一定要*大写*)文件 其中只能包含一个顶级域名,像这样: example.com 如果你是 ...

  9. URI和URL的区别 一起学习呗

    一直存在很多技术上的争论,其中最为妙的恐怕就是web地址应该叫什么的问题.通常情况就是这样:有人把地址栏的内容叫"URL",这时候有些人就来劲了:"不!其实那就是URI. ...

  10. macaca web(4)

    米西米西滴,吃过中午饭来一篇,话说,上回书说道macaca 测试web(3),参数驱动来搞,那么有小伙本又来给雷子来需求, 登录模块能不能给我给重新封装一下吗, 我说干嘛封装,现在不挺好,于是乎,接着 ...