对象的属性: 不仅在__init__里面添加,还可以在其他方法或者类外面添加

class Game:
def __init__(self,name,age):
self.name = name
self.age = age p1 = Game('盖伦', 18)
p1.sex = 'male' # 类外面添加对象属性
print(p1.__dict__)

类的属性: 不仅在类内部添加,还可以在类外面添加

class Game:

    def __init__(self,name,age):
self.name = name
self.age = age Game.tools = '青龙刀' # 类外面添加类的属性
print(Game.__dict__)

对象空间中存在一个类对象指针,所以对象可以找到类中的变量以及方法 (对象可以找类的属性)

类名只能找到类中的变量,方法,后者(父类中的),不能找对象中的属性  (类不能找对象的属性)

组合: 将一个对象封装到另一个对象的属性中

class Game:
def __init__(self,name,ad):
self.name = name
self.ad = ad def attack(self,x):
print('{}攻击{}'.format(self.name,x.name)) def equip_wappon(self,wap):
self.wap = wap # 组合:给一个对象封装一个属性该属性是另一个类的对象
# 给wuda封装一个wuda.wap属性(knife), wuda.wap = knife class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def waapon_attack(self,w,s):
print('{} 用 {} 攻击了 {}'.format(w.name,knife.name,s.name))
knife = Weapon('18厘米长棍', 99)
wuda = Game('武大',20)
seman = Game('西门',10)
# wuda.attack(seman)
# knife.waapon_attack(wuda,seman) # 武大 用 18厘米长棍 攻击了 西门
wuda.equip_wappon(knife)
wuda.wap.waapon_attack(wuda,seman) # 武大 用 18厘米长棍 攻击了 西门

组合示例

组合的好处:

   代码更合理

   类与类之间的耦合性增强(并不是好事)

补充: 开发原则,高汇聚,低耦合

继承

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

class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Person:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Dog:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
# 以上三种类,都有相似的属性。所以Person、Dog可以继承Animal,减少代码

继承举例

继承的示例:

class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Person(Animal): # (Animal)继承Animal的属性
pass p1 = Person('西门','M',18) # 必须传参数,不然会报错
print(p1.__dict__) # {'name': '西门', 'sex': 'M', 'age': 18} Animal是父类
Person是子类,派生类

单继承

类名:

可以调用父类的属性,方法

class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
# type = '不喜欢吃饭'
pass print(Person.type) # 类名可以调用父类的属性
Person.eat('') # 类名可以调用父类的方法
Person.type = 666 # 这样只是给Person添加type属性,并不能更改父类的type属性
print(Animal.__dict__) # type = '动物类'
print(Person.type)

类名

对象:

对象执行类的父类的属性和方法

class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
type = '不喜欢吃饭'
pass p1 = Person('西门','M',18) # 必须传参数,不然会报错
print(p1.type) # 动物类 可以调用父类的属性
print(p1.type) # 不喜欢吃饭 如果自己有和父类相同的属性,则先用自己的
p1.eat() # 可以调用父类的方法
p1.type = 666 # 这样只是改p1的属性,并不能更改父类的type属性
print(p1.__dict__) # type = '动物类'

对象

继承:单继承,多继承

# python 类:
# 经典类:只存在python2x,不继承object的类,所以python2x既有经典类,又有新式类。
# 新式类:继承object类。python3x所有的类默认都继承object。
# 单继承都一样。
# 多继承不一样:
# 经典类 :深度优先。
# 新式类 : mro 继承顺序,C3算法。
# 既要执行子类方法,也要执行父类方法
class Animal:
type = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('要吃饭') class Person(Animal): # (Animal)继承Animal的属性
def __init__(self, name, sex, age, mind):
# Animal.__init__(self,name,sex,age) #方法一
super().__init__(name, sex, age) # 方法二
self.mind = mind def eat(self):
super().eat() p1 = Person('西门', 'M', 18, '有思想')
print(p1.__dict__)
p1.eat() # 要吃饭
# 方法一: Aniaml.__init__(self,name,sex,age)
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__) # 方法二:super
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__)
 

day 19 类的名称空间,组合,派生的更多相关文章

  1. Python 类的名称空间和组合

    一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...

  2. python_面向对象,类名称空间,对象名称空间,组合

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量(字段) 动态属性就是定义在类中的方法 其中类 ...

  3. using 关键字给类和名称空间指定别名

    1. using System; using System.Text; namespace DLL { public class Class1 { public void showStr() { Co ...

  4. python面向对象:类空间,对象空间, 组合

    一. 类空间,对象空间 1. 类空间,对象空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变 ...

  5. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  6. 搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...

  7. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  8. python 之 面向对象基础(定义类、创建对象,名称空间)

    第七章面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问 ...

  9. 11-TypeScript中的名称空间

    在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...

随机推荐

  1. 130. Surrounded Regions 卧槽!我半梦半醒之间做出来的。

    打开这个题,做了一半躺下了. 结果,怎么都睡不着.一会一个想法,忍不住爬起来提交,要么错误,要么超时. 按照常规思路,依次对每个点检测是否是闭包,再替换,超时.计算量太大了. 还能怎么做呢?没思路,关 ...

  2. pod引用第三方库的几种方式

    pod引用库的原理,本质上是去找.podspec文件,podspec中包含库的地址及最新的版本号(tag标签),如果pod时没有指定版本,则pod install时会去下载podspec文件中指定的最 ...

  3. UICollectionView setPrefetchingEnabled

    UICollectionView 开启是否开启预加载,如果开启,cell在没显示的时候就回去调用cellForIndex…方法,如果没开启,cell只有在显示的时候才会去调用cellForIndex… ...

  4. position: relative;导致页面卡顿

    1.现象: vue单页面项目 只有在某个页面切换的时候出现页面卡顿现象 经过长时间排查 确定最终原因是 该模块外层div使用  position: relative 根本原因:待完善

  5. golang使用Nsq(转)

    为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golan ...

  6. easy.py使用中ValueError: could not convert string to float: svm_options错误问题解决

    在使用easy.py中出现如下图所示问题 解决方法: 1.找到cmd = '{0} -svmtrain "{1}" -gnuplot "{2}" "{ ...

  7. indexOf实现引申出来的各种字符串匹配算法

    我们在表单验证时,经常遇到字符串的包含问题,比如说邮件必须包含indexOf.我们现在说一下indexOf.这是es3.1引进的API ,与lastIndexOf是一套的.可以用于字符串与数组中.一些 ...

  8. python 问答

    1.list和tuple有什么区别? list是可变的,可以添加list.append,可以插入list.insert,可以改变元素值list[2] ='a':而tuple在初始化的时候就确定了,不能 ...

  9. 删除node_modules文件夹

    老版本的npm对有node_modules文件夹太长的问题,新版本就没有这个问题.2.7? npm install rimraf -g rimraf node_modules

  10. Python系列之 __new__ 与 __init__

    很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ ...