day24 面向对象,交互,组合,命名空间,初始继承
面向对象的命名空间:
#属性:静态属性 (直接和类名关联或者直接定义在class下的变量)
# 对象属性 (在类内和self关联,在类外和对象名关联的变量)
# 动态属性(函数) class Foo:
country = 'China'
country_lst = ['China']
def __init__(self,name):
self.name = name alex = Foo('alexander')
egg = Foo('egon')
alex.age = 90
alex.country_lst = []
alex.country_lst.append('印度')
# print(Foo.country_lst)
# Foo.role = 'Person'
# print(Foo.country)
# print(alex.name)
# print(egg.name)
# Foo.country
# alex.country = '印度'
# print(alex.country)
# print(egg.country)
# print(Foo.country)
# del alex.country
# print(alex.country)
# print(alex.country_lst)
# alex.country_lst.append('印度')
# print(alex.country_lst)
# print(egg.country_lst)
# print(Foo.country_lst)
#类名操作变量 不管操作可变还是不可变数据类型 都是类中对应的变量发生变化
#对象名操作静态变量
#引用变量:现在自己的命名空间中查找,找不到就去类的命名空间找
#修改变量:
# 如果是对可变数据类型中的元素进行修改,那么全局生效
# 如果是对变量进行重新赋值,那么只是在对象自己的命名空间里增加了一个新的属性
# 结论:应该尽量用类名去使用静态变量 # 设计一个类,统计这个类被实例化的次数,且所有的对象共享这个属性
# class Foo:
# count = 0
# def __init__(self):
# Foo.count += 1
#
# f = Foo()
# f2 = Foo()
# f3 = Foo()
# print(f.count) #Foo.count
# print(f2.count) #Foo.count
# print(f3.count) #Foo.count class Person:
def __init__(self):pass
#给一个什么属性都没有的对象赋一些初识的属性
def eat(self):
print('吃猪食') alex = Person() #裸着
print(alex.__dict__)
alex.name = 'alexander'
# alex.eat = '泔水' #对象使用名字的顺序:先用自己的,再用类的
# alex.eat()
#对象可以使用类的
#而类无法使用对象的
# print(Person.eat)
# print(alex.eat) #类对象指针的东西 alex = {'eat':eat}
组合:
#函数
#定义 调用 返回值 参数、命名空间和作用域 #面向对象
#定义 、命名空间
#三大特性:封装继承和多态(组合) #组合 : 什么 有 什么 的关系
#一个对象的属性是另外一个类的对象
#老师有生日
# class Teacher:
# def __init__(self,name,age,sex):
# self.name = name
# self.age = age
# self.sex = sex
# # self.birth_year = year
# class Birthday:
# def __init__(self,year,month,day):
# self.year = year
# self.month = month
# self.day = day
# birthay1 = Birthday(1968,12,31)
# boss_gold = Teacher('太亮',40,'不详')
# boss_gold.birth = birthay1
# boss_gold.birth.year #boss_gold.bith.year
#老师有生日 : 年月日
#将一个类的对象拥有的属性 再将其定义成一个类以提高代码的复用
# class Teacher:
# def __init__(self,name,age,sex,year,month,day):
# self.name = name
# self.age = age
# self.sex = sex
# self.birth = Birthday(year,month,day)
# class Birthday:
# def __init__(self,year,month,day):
# self.year = year
# self.month = month
# self.day = day
# boss_gold = Teacher('太亮',40,'不详',1968,12,31)
# print(boss_gold.birth) #圆形类
from math import pi
class Circle:
def __init__(self,r):
self.radius = r
def perimeter(self):
return 2*pi*self.radius
def area(self):
return pi*(self.radius**2)
#环形类
class Ring:
def __init__(self,outer_r,inner_r):
self.outer_circle = Circle(outer_r)
self.inner_circle = Circle(inner_r)
def perimeter(self):
return self.outer_circle.perimeter()+self.inner_circle.perimeter()
def area(self):
return self.outer_circle.area() - self.inner_circle.area()
r1 = Circle(5)
print(r1.perimeter())
print(r1.area())
r = Ring(10,8)
print(r.perimeter())
print(r.area())
# 既能hold住圆形的问题
# 又能解决环形的问题
#10,20
# def func(arg1,arg2):
# outer_circle = Circle(20)
# inner_circle = Circle(10)
# print(outer_circle.area() - inner_circle.area())
#
# def func2(arg1,arg2):
# outer_circle = Circle(20)
# inner_circle = Circle(10)
# print(outer_circle.perimeter() + inner_circle.perimeter())
# # 500个环
# ring1 = Ring(20,10)
# ring1.area()
#思想 —— 技术 #面向对象 命名空间
#组合 : 老师有生日,环中有圆
#游戏 :组合
组合例题:
#狗
class Dog: # 定义一个狗类
def __init__(self, name, breed, aggressivity, life_value):
self.name = name # 每一只狗都有自己的昵称;
self.breed = breed # 每一只狗都有自己的品种;
self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
self.life_value = life_value # 每一只狗都有自己的生命值; def bite(self,people):
people.life_value -= self.aggressivity
#人
class Person: # 定义一个人类
def __init__(self, name, aggressivity, life_value, money):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
self.money = money def attack(self,dog):
dog.life_value -= self.aggressivity def get_weapon(self,weapon_obj):
if self.money > weapon_obj.price:
self.money -= weapon_obj.price # 金老板花钱买武器
self.weapon = weapon_obj # 金老板装备打狗棒
self.aggressivity += weapon_obj.aggr # 金老板的攻击力增加了 # boss_gold = Person('金老板',5,250,100)
# huang = Dog('大黄','藏獒',100,3000)
# huang.bite(boss_gold)
# print(boss_gold.life_value)
# boss_gold.attack(huang)
# print(huang.life_value)
#不公平
#武器装备
#人 有 武器 —— 组合
#武器:攻击力,名字,价格
class Weapon:
def __init__(self,name,price,aggr):
self.name = name
self.price = price
self.aggr = aggr
dgb = Weapon('打狗棒',99.8,100)
boss_gold = Person('金老板',5,250,100)
huang = Dog('大黄','藏獒',100,3000)
boss_gold.get_weapon(dgb)
boss_gold.attack(huang)
print(huang.life_value) #游戏的组合
#人可以有装备 ——
#狗 —— #组合和命名空间
#继承的一点知识
初识继承:
# 面向对象的三大特性之一 —— 继承
# 继承 :至少两个类 : 什么 是 什么 的关系,为了避免几个类之间有相同的代码
# 父类 : Animal
# 子类 : Dog、Person
#动物
class Animal:
def __init__(self,name,aggressivity,life_value):
self.name = name
self.aggressivity = aggressivity
self.life_value = life_value
#狗
class Dog(Animal): # 定义一个狗类
def bite(self,people):
people.life_value -= self.aggressivity
#人
class Person(Animal): # 定义一个人类
def attack(self,dog):
dog.life_value -= self.aggressivity def get_weapon(self,weapon_obj):
if self.money > weapon_obj.price:
self.money -= weapon_obj.price # 金老板花钱买武器
self.weapon = weapon_obj # 金老板装备打狗棒
self.aggressivity += weapon_obj.aggr # 金老板的攻击力增加了
huang = Dog('大黄',100,3000) #__init__ 找父类
print(huang.life_value)
boss_gold = Person('金老板',5,250) #__init__ 自己没有 找父类
print(boss_gold.life_value)
# Dog.bite(Person)
print(Dog.__bases__)
print(Animal.__bases__) #python 两种类:经典类 新式类
#python3 新式类 —— 都默认继承object class Animal(object): == class Animal:
#python2 经典类和新式类 并存
#class Animal: 经典类 —— 继承顺序 个别使用方法
#class Animal(object): 新式类
#两个类中有相同的代码,
# 继承:把相同的代码放在父类中,子类的对象在子类中没有找到方法的时候,使用父类的
# 单继承和多继承
# 父类 超类 基类
# 子类 派生类
# 抽象和继承
day24 面向对象,交互,组合,命名空间,初始继承的更多相关文章
- Python面向对象(组合、菱形继承、多态)
今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事 1.创造空对象 2.触发对象下的__init__方法,然后将p连同参数一同传给init ...
- 类命名空间与对象、实例的命名空间 and 面向对象的组合用法
类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...
- 面向对象之组合VS继承:继承过时了?
在阅读Effective Java中的第16条时发现了一个有趣的机制或者说是模式,那就是组合(文中翻译为复用,但是作者认为组合更能体现这种模式的精神),并且文中建议使用组合. 那什么是组合, ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- JavaScript 面向对象程序设计(下)——继承与多态 【转】
JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- 关于JS面向对象、设计模式、以及继承的问题总结
1.对象:JS中万物皆对象,它是一个泛指 类:对象的具体的细分 (物以类聚,人与群分.具有相同属性和方法的实例的一个集合总称) 实例:某一个类别中具体的一个事物 对象是一个抽象的概念,类似于我们的自然 ...
- day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析
day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...
随机推荐
- oracle 定时 job
最近在工作中遇到了要在oracle里面创建一个定时job,从远程数据库里面定时把某张表里面的数据更新到本地服务器上某个表里,具体操作: 1.在自己数据库里面先创建一张表test create tabl ...
- IP保留地址
保留地址的网络只能在内部进行通信,而不能与其他网络互连.因为本网络中的保留地址同样也可能被其它网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题. 但是这些使用保留地址的网络可以 ...
- JavaScript自定义对象
一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...
- 堆(Heap)详解——Java实现
Heap 堆定义:(这里只讲二叉堆)堆实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于/大于它的所有后裔,最小/大元在堆的根上. 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大 ...
- hadoop环境配置
0. Hadoop源码包下载 http://mirror.bit.edu.cn/apache/hadoop/common/ 1. 集群环境 Master 172.16.11.97 Slave1 1 ...
- Tomcat解决中文乱码并部署项目
1.在Tomcat下的server.xml中添加URIEncoding="UTF-8"(解决中文乱码的问题) 2.在Tomcat下的server.xml中添加<Context ...
- x学生管理系统(用中间件)-------基于FORM组件
目的:实现学生,老师,课程的增删改查 models.py from django.db import models # Create your models here. class UserInfo( ...
- Centos + docker,Ubuntu + docker介绍安装及详细使用
docker笔记 常用命令 设置docker开机自启:sudo chkconfig docker on 查所有镜像: docker images 删除某个镜像:docker rmi CONTAINER ...
- Python入门:求1-2+3-4+5...99的所有数的和
num =1 sum =0 while num <=99: if num % 2 ==1: sum = sum + num num =num +1 print(sum) 2.求1-2+3-4+5 ...
- 012-Python-paramiko和IO多路复用
1.IO 多路复用 1.监听多个socket变化 2.socket服务端 IO多路复用+socket 来实现web服务器: a.服务端优先运行 b.浏览器:http://.......com 浏览器连 ...