对象的属性: 不仅在__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. idea 执行maven 命令

    如果当前账号不是超级管理员,这边需要执行系统用户变量, 输入安装文件bin路径 参考:https://blog.csdn.net/qq_19167629/article/details/7958490 ...

  2. Delphi TQuery 的Locate用法

    Help里的解释 function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions) ...

  3. eclipce导入java 项目不可用

  4. GPS坐标转换 百度地图API调用

    1 如果GPS输出的值是DD.DDDDDDDD格式的,直接调用地图API的转换函数处理,就可以正常显示2 如果GPS输出的值是DD.MMMMMMMM格式的,就需要先进行分转度处理,然后再调API,就可 ...

  5. 修饰词public、private、protected、默认、四者之间的区别

    在Java语法中,对于类与类中的成员变量和成员方法是通过访问控制符来区分控制的. 下面来看看这四种访问控制符的区别:(public.protected.private.default) 1.publi ...

  6. Hibernate 再接触 组件映射

    将另外一个类嵌入到另外一个类 从而合并生成一张表 Husband.java package com.bjsxt.hibernate; import javax.persistence.Embedded ...

  7. 利用monkey测试android,入门级用户可能遇见的错误及解决办法 【转】

    转自[http://blog.csdn.net/zm2714/article/details/7977930] 一.D:\android\android-sdk-windows\tools目录中没有a ...

  8. 生成一个文件夹中的所有文件的txt列表

    1.windows操作系统中 1.用管理员运行打开dos界面: 2.用cd转到相应的文件夹中: 3.用dir /b /on >list.txt来生成文件列表的txt. 2.Mac系统中 1.打开 ...

  9. PL/SQL Job

    1. 鼠标右键点击 jobs 弹出 Create Job 对话框,如下图: 2. 在对话框中输入相应的值,如下图: 其中: What                   ——作业执行时将要调用的存储过 ...

  10. linux下网络配置

    配置相关 http://bbs.acehat.com/thread-813-1-1.html