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

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

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

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

对于类的静态属性和方法不同操作发生的效果

#·类名操作变量 不管操作可变还是不可变数据类型 都是类中对应的变量发生变化
#对象名操作静态变量
#引用变量:现在自己的命名空间中查找,找不到就去类的命名空间找
#修改变量:
# 如果是对可变数据类型中的元素进行修改,那么全局生效

#如果对可变数据类型,断开并指向新的数据类型,那只是对象自己的静态属性发生变化
# 如果是对变量进行重新赋值,那么只是在对象自己的命名空间里增加了一个新的属性
# 结论:应该尽量用类名去使用静态变量

# 设计一个类,统计这个类被实例化的次数,且所有的对象共享这个属性

class Foo:
country='中国'
country_list=['china']
def __init__(self,name):
self.name=name
f1=Foo('alex')
f2=Foo('jinxing')
f1.country='印度' #当我在对象中操不可变类型的作静态变量时,只是类自己中的静态变量发生变化
print(f1.country) #印度
print(f2.country) #中国
print(Foo.country) #中国
Foo.country='美国' #当在类中操作不可变类型的静态变量时,对象的静态变量都会发生变化,
print(Foo.country) # 美国
print(f1.country) #印度 #除了这个在上边已经单独对对象的静态属性进行改变的
print(f2.country)# 美国
f1.country_list.append('韩国') #在对象中操作可变类型的静态属性时,当对其增删改时
# ,整体都会发生变化
print(f1.country_list)#['china', '韩国']
print(Foo.country_list) #['china', '韩国']
f2.country_list=[] #这个是将f2.country_list断开可原来的指向,指向了另外一个新的列表
print(f2.country_list)#[] #得到的结果是
print(Foo.country_list) #['china', '韩国']

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

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

面向对象的组合用法

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

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

圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

class Squear:   #先定义一个类
def __init__(self,radius):
self.radius=radius
def squear(self): # 在类中有关于他面积的动态属性,
return 3.14*(self.radius**2)
def perimeter(self):
return self.radius*2*3.14
class Ring:
def __init__(self,r1,r2): #在这里是将其他类中的对象当作此类中的数据来引用
self.a1=Squear(r1)
self.a2=Squear(r2)
def squear_ring(self):
return self.a1.squear()-self.a2.squear() #在这里可以直接调用调用过来的
# 对像的属性来进行相印的计算和操作的
def perimeter_ring(self):
return self.a1.perimeter()+self.a2.perimeter()
w3=Ring(30,10)
print(w3.squear_ring()) #2512.0 计算出圆环的面积 print(w3.perimeter_ring()) #计算出圆环的周长

计算圆环的面积和周长

#类的组合,
class Preson:
def __init__(self,name,life_vale,aggressivity,money):
self.name=name
self.life_value=life_vale
self.aggressivity=aggressivity
self.money=money
def attac(self,animal): #定义了人的攻击属性,人攻击狗
print('%s攻击了%s'%(self.name,animal.name))
animal.life_value-=self.aggressivity
def get_weapen(self,weapen_name):#人设置了一个方法,装备武器
if self.money>weapen_name.price:
self.aggressivity += weapen_name.argg#装备武器是对人的
# 一些特点进行加成,这里需要引用武器这个对象属性
self.money -=weapen_name.price class Dog:
def __init__(self,name,life_vale,aggressivity,breed):
self.name=name
self.life_value=life_vale
self.aggressivity=aggressivity
self.bred=breed
def attac(self,pieple):
print('%s咬击了%s'%(self.name,pieple.name))
pieple.life_value-=self.aggressivity
class Weapon: #在这里定义了一个武器的类
def __init__(self,name,price,argg):#武器带有的一些属性
self.name=name
self.price=price
self.argg=argg
gold_jin=Preson('金星',1000,10,200)
gou=Dog('黑子',500,100,'哈士奇')
dgg=Weapon('打狗棍',100,50)#设置了一个武器对象
gold_jin.get_weapen(dgg) #人执行了get_weapon的方法,将武器打狗棍的属性加上去
print(gold_jin.money) #钱由200变成100 #当加成完成之后再看人的钱和,攻击力会发生变化
print(gold_jin.aggressivity)#攻击力由10增长到60
gold_jin.attac(gou) #此时执行方法 攻击 gou #金星攻击了黑子
print(gou.life_value) #440 狗的血量由500降到440

人狗大战之带武器

class Teacher:
def __init__(self,name,age,sex,brith):
self.name=name
self.age=age
self.sex=sex
self.brith=brith
class Birthda:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
a=Teacher('alex',18,'man',Birthda(1997,10,10)) #这里可以直接将里一个Brithda中的一个对象传入
# ,当他的一个数据属性之一。 然后就可以在调用的时候使用(调用)这个对象中的一些属性
print(a.name,a.brith.year,a.brith.day)
#alex 1997 10 这是打印的结果

老师和生日

当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

继承

什么是继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

两个类中有相同的代码,
# 继承:把相同的代码放在父类中,子类的对象在子类中没有找到方法的时候,使用父类的
# 单继承和多继承
# 父类 超类 基类
# 子类 派生类
# 抽象和继承

class Animal:#定义一个父类,
def __init__(self,name,hurt,life_value):
self.name=name
self.hurt=hurt
self.life_value=life_value
class Dog(Animal): #注意子类的使用父类方法 #子类,其中有一些特种是和父类中一样的
# 所以不用再一一去设定(写ef __init__(self,name,hurt,life_value):重复写这些内容,
# 直接调用即可
def eat(self,people):
people.life_value-=self.life_value
class People(Animal):
def eat(self,dog):
dog.life_value-=self.life_value
huang=Dog('大黄',100,1000)
alex=People('alex',50,500)
huang.eat(alex)
print(alex.life_value)

从Animal开始认识继承

python中类的继承分为:单继承和多继承

class ParentClass1: #定义父类
pass class ParentClass2: #定义父类
pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
pass

查看继承

>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)

继承与抽象(先抽象再继承)

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

1.将奥巴马和梅西这俩对象比较像的部分抽取成类;

2.将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

继承与重用性

day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级的更多相关文章

  1. day10 python学习 函数的嵌套命名空间作用域 三元运算 位置参数 默认参数 动态参数

    1.三元运算 #1.三元运算 利用已下方法就可以实现一步运算返回a b中大的值 def my_max(a,b): c=0 a=int(input('请输入')) b=int(input('请输入')) ...

  2. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  3. python开发面向对象基础:人狗大战学面向对象

    一,通过函数写人狗大战这个故事 #!/usr/bin/env python #_*_coding:utf-8_*_ #1.函数 人模子 def person(name,level,life_value ...

  4. 吴裕雄--天生自然python学习笔记:Python3 命名空间和作用域

    命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空间是独立的,没有任何关系的,所以一个 ...

  5. 廖雪峰Python学习笔记——使用元类

    元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是“一个类的类”.任何实例是它自己的类都是元类. class demo(object): pass obj ...

  6. python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)

    *** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...

  7. Python学习之路——函数对象作用域名称空间

    一.函数对象 # 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 # 函数对象的应用 # 1 可以直接被引用 fn = cp_fn # 2 可以当作函数参数传 ...

  8. python学习|类和实例

    什么叫实例对象呢?大家可以想象一下,[类]就像工厂的模具,以它为模板,造出来的成千上万的产品,才是被我们消费.购买.使用,真正融入我们生活的东西.这些产品,在Python中就叫[实例对象]. 往深了说 ...

  9. python学习笔记9-单元测试unittest

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 在说unittest之前,先说几个概念: TestC ...

随机推荐

  1. Python中的魔术方法详解

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  2. Many Easy Problem

    转自hwk0518,不胜感谢,侵删.

  3. vue封装组件的正确方式-封装类似elementui的组件

    最近读了下element的源码,仿照他封装了两种不同的组件. 第一种:通过组件来调用显示的 <template> <!--src/component/custom/main.vue- ...

  4. laravel 连接同一服务器上多个数据库操作 、 连接多个不同服务器上的不同数据库操作以及多个数据库操作的事务处理

    !注意:标红的要注意区分开 第一步.配置.env文件(同一服务器上多个数据库) DB_CONNECTION=pgsqlDB_HOST=IP(例如:127.0.0.1)DB_PORT=端口号(例如:54 ...

  5. HDU 2891

    DESCRIPTION: 大意是说 先给你n个 同学的 上课时间.一周的第几天,开始和结束的时间点.然后对应q个出去玩的时间.要你给出谁不能出去.如果都能出去就输出none. 开始做的时候觉得每个同学 ...

  6. poj3020 二分图匹配 最大独立集

    这是一道水题, 这里是最大流解法,之后再补 坑在又忘了反向建边了 题意:给你二维bool数组,让你求出能用多米诺骨牌覆盖所有 1 且骨牌最少的放法(因为多米诺骨牌1*2的结构方便描述,原题没有),原本 ...

  7. C#几种截取字符串的方法(split 、Substring、Replace、remove)

    C#截图字符串常用的方法有 split .Substring.Replace.remove等. split的使用: 1. Split( Char ()) 返回的字符串数组包含此实例中的子字符串(由指定 ...

  8. 使用Condition配合await()和signal()实现等待/通知

    关键字Synchronized与wait()和notify()/notifyAll()结合可以实现“等待/通知”模式, Lock类的子类ReentrantLock也可以实现同样的功能,但需要借助Con ...

  9. python中read()、readline()、readlnes()

    在python中 1.file.read()直接按原样读取文件,它通常用于将文件内容放到一个字符串变量中,如果文件大于可用内存,则不可能实现这种处理,因为原来文件里面是str_class,所以 fil ...

  10. centos6:一个网卡上显示多个ip地址的错误

    网卡显示如下:  上面显示em1有两个ip地址,其中36是设置的固定IP,212这个ip不清楚怎么搞出来的,但是通过212地址也能够正常连接主机.重启网卡之后,还是没有变化. 网卡em1配置如下,/e ...