给大家介绍对象hhhh

封装

举个例子,把乱七八糟的数据仍到列表,数据层面的封装

把常用的代码打包成一个函数,封装

外观特征(静态)  能做什么(动态)

对象=属性(静态) + 方法(动态)

1.方法多用函数

2.类是图纸,对象是根据图纸制作的东西

3.类在整体结构中和函数很像,所以为了区分,类的开头字母大写,函数小写

class Turtle:    #封装类

  属性

  方法

  def climb()  #方法中的一个例子

tt=Turtle()    #创建类,与函数类似

tt.climd()    #调用类中的函数

    

oo 面向对象

封装,信息隐蔽技术  list1.sort(),排序列表,并不知道过程

继承,子类自动共享父类之间数据和方法的机制

class Mylist(list):  #继承list的方法和属性

  pass    #什么都不用做

list2 = Mylist()

list2.append(0)

list2

[0]

多态:对不同对象调用同一方法,结果因对象而变

class A:

  def fun(self):

    print('a')

class B:

  def fun(self):

    print('b')

a=A()

b=B()

a.fun  #a

b.fun  #b

面向对象编程

self要写进第一个参数对象

self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编程语言统一,减少理解难度),不要搞另类,大家会不明白的。

self指的是类实例对象本身(地址) (注意:不是类本身)。

class中函数调用

在给出一个实例以后,我们调用类中的具体方法(即函数)时,默认传入了self参数(即实例地址)

这样对象不唯一,也会各自运行各自的结果

class Ba:

  def setname(self,name):    #self为实例地址

    self.name = name    # 代入 实例.name = name

  def kick(self):

    print('%s' % self.name)  #打印 实例.name

a = Ba()    

a.setname('a')    #self地址为a(实例地址)

b = Ba()

b.setname('b')

c = Ba()

c.setname('0')

a.kick()    #a

c.kick()    #0

构造函数

构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象类创建以后会立即调用

__init__(self,param1,param2.....)

class Ba:

  def __init__(self,name)

    self.name = name

  def kick(self):

    print('%s' % self.name)

b = Ba('b')

b.kick()    #b

class Per:

  name= 'a'

>>p = Per()

>>p.name  #a

class Per:

  __name= 'a'

  def g(self):

    return self.__name

>>p = Per()

>>p.name  #报错,__为私有

>>p.g    #返回a

>>p._Per__name  #返回a

_类名__变量名

继承

class Deribedclassname(baseclassname):    #()中为父类,名字

class Pae:

  def hello(self):

    print('调用父类')

class Chi(Pae):

  pass

>>p = Pae()

>>p.hello

调用父类

>>c = hello()

>>c.hello()

调用父类

如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性

对父类不受影响

class Chi(Per):

  def hello(self):

    print("调用子类“)

>>c = Chi()

>>c.hello()

调用子类

>>p.hello()

调用父类

import random as r

class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10) def move(self):
self.x -= 1
print("我的位置:",self.x,self.y) class Gold(Fish):
pass class Carp(Fish):
pass class Sa(Fish):
pass class Shark(Fish):
def __init__(self):      #与父类冲突,覆盖父类,需要解决方案
self.hungry = True def eat(self):
if self.hungry:
print("天天有吃的")
self.hungry = False
else:
print("太撑了")

1.调用未绑定的父类方法

def __init__(Fish):

  Fish.__init__(self)    #在子类执行的前面调用父类,self是子类的,Shark

  self.hugry = True

2.使用 super函数

def __init__(Fish):      #这里的父类是Fish,super调用的就是父类的__init__()

  super().__init__()     #有很多父类也不用一个个写,自动一层层找出__init__()的方法,

  self.hugry = True    

多重继承,多写几个父类,尽量避免使用,可能出现不可预见的BUG(致命)

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

实例.调入类.类中数据
class Turtle:
def __init__(self,x):
self.num = x class Fishl:
def __init__(self,x):
self.num = x class Pool:
def __init(self,x,y):
self.turtle = Turtle(x)  #把T中数据调入self.turtle,可使用self.turtle.num
self.fish = Fish(y)      #实例.调入类.类中数据 def print_num(self):
print("乌龟 %d,小鱼%d" % (self.turtle.num,self.fish.num))

Mix -in

(转载)

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()
#egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python课程

人狗大战(转载)

class Person:  # 定义一个人类
role = '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
class Dog:  # 定义一个狗类
role = '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 Weapon:    #装备
def __init__(self,name, price, aggrev, life_value):
self.name = name
self.price = price
self.aggrev = aggrev
self.life_value = life_value def update(self, obj): #obj就是要带这个装备的人
obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少
obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击
obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,扎死对方
obj.life_value -= 500 # 假设攻击力是500
lance = Weapon('长矛',200,6,100)
egg = Person('egon',10,1000,600) #创造了一个实实在在的人egg
ha2 = Dog('二愣子','哈士奇',10,1000) #创造了一只实实在在的狗ha2 #egg独自力战"二愣子"深感吃力,决定穷毕生积蓄买一把武器
if egg.money > lance.price: #如果egg的钱比装备的价格多,可以买一把长矛
lance.update(egg) #egg花钱买了一个长矛防身,且自身属性得到了提高
egg.weapon = lance #egg装备上了长矛 print(egg.money,egg.life_value,egg.aggressivity) print(ha2.life_value)
egg.attack(ha2) #egg打了ha2一下
print(ha2.life_value)
egg.weapon.prick(ha2) #发动武器技能
print(ha2.life_value) #ha2不敌狡猾的人类用武器取胜,血槽空了一半

转载

class BirthDate:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day class Couse:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period class Teacher:
def __init__(self,name,gender,birth,course):
self.name=name
self.gender=gender
self.birth=birth      
self.course=course
def teach(self):
print('teaching') p1=Teacher('egon','male',
BirthDate('','',''),       #把B中数据调入T中,实例p1
Couse('python','','4 months')
) print(p1.birth.year,p1.birth.month,p1.birth.day) print(p1.course.name,p1.course.price,p1.course.period)
'''
运行结果:
1995 1 27
python 28000 4 months
'''

类写完就是类对象,实例对象

class C:

  def x:

    count = 0

>>a=C()

>>b=C()

>>c.count+=10    #创建实例对象的属性

>>c.x()      #报错,属性如果与方法名相同,属性覆盖方法

>>a.count

0

>>c.count  

10

>>C.count    #类对象

0

>>C.count += 100

>>a.count      #增加100

100

>>c.count    #实例对象的属性,不变

10

避免这种事发生,不要试图在一个类里边定义出所有能想到的特性和方法,应该理由继承和组合机制进行扩展。

用不同的词性命名,如属性名用名词,方法名用动词

关于绑定

class C:

  def set(self,x,y)

    self.x = x

    self.y = y

  def printXY(self):

    print(self.x,self.y)

>>d = C()

>>d.__dict__

{}

>>C.__dice__

{.............数据,方法.}

>>d.set(1,2)    #静态的绑定类对象的方法里

>>d.__dice__

{'y':2,'x':1}

>>def C

>>e =C()    #报错

>>d.printXY()    #1 2    

尽量用实例属性,self

不要用类属性

python 11 类与对象的更多相关文章

  1. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  2. python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

  3. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  4. python的类与对象

    类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...

  5. Python 定制类与其对象的创建和应用

    1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self, ...

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

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

  7. python的类和对象(类的静态字段)

    转自:http://www.cnblogs.com/Eva-J/p/5044411.html 什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是 ...

  8. python的类和对象——番外篇(类的静态字段)

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  9. python的类和对象——进阶篇

    写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...

随机推荐

  1. SpringBoot + Spring Cloud Consul 服务注册和发现

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  2. PD快充和QC快充

    参考链接:https://zhidao.baidu.com/question/246420719602653564.html PD快充协议 PD即USB Power Delivery Specific ...

  3. Django学习路3

    1.打开 Data Source alt insert 打开 Data Source 找到 db.sqlite3 确定 Download 下载后 TestConnection 测试是否成功 2.项目下 ...

  4. 什么是 PHP SimpleXML?

    PHP SimpleXML PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理. 什么是 PHP SimpleXML? SimpleXML 是 PHP 5 中的新特性 ...

  5. Python os.pipe() 方法

    概述 os.pipe() 方法用于创建一个管道, 返回一对文件描述符(r, w) 分别为读和写.高佣联盟 www.cgewang.com 语法 pipe()方法语法格式如下: os.pipe() 参数 ...

  6. PHP cal_to_jd() 函数

    ------------恢复内容开始------------ 实例 把 2007 年 6 月 20 日(格利高里历法)转换为儒略日计数: <?php$d=cal_to_jd(CAL_GREGOR ...

  7. PHP jdtounix() 函数

    ------------恢复内容开始------------ 实例 把格利高里历法的日期转换为儒略日计数,然后把儒略日计数转换为 Unix 时间戳: <?php$jd=gregoriantojd ...

  8. Prism.Interactivity 和 Prism.Modularity 介绍

    Prism.Interactivity: 主要用来截取View即界面的一些处理,而这些功能通过vm 不好实现,只能用 CommandBehaviorBase 来截取处理,特别是在处理界面异常很有用. ...

  9. 详细记录了python爬取小说《元尊》的整个过程,看了你必会~

    学了好几天的渗透测试基础理论,周末了让自己放松一下,最近听说天蚕土豆有一本新小说,叫做<元尊>,学生时代的我可是十分喜欢读天蚕土豆的小说,<斗破苍穹>相信很多小伙伴都看过吧.今 ...

  10. java进阶(3)--接口

    一.基本概念 1.接口为引用数据类型,编译后也是class字节码文件 2.接口是完全抽象的,(抽象类是半抽象的),属于特殊的抽象类 3.接口定义方法:[修饰符列表]interface 接口名{} 4. ...