# 对象 = 属性 + 方法
>>> # Python中的类名约定以大写字母开始
>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它是不需要的
>>>
>>> # Python中的self就相当于Java中的this

>>> # self ,一般都放在方法的第一个参数中这是默认的要求

class Ball:
    def setName(self,name):
        self.name=name
    def kick(self):
        print("我叫%s,谁踢我,找死啊..." %self.name)

a = Ball() # 不需要用new关键字,注意和其它语言的区别
a.setName("阿黄")
b = Ball()
b.setName("黄红义")

a.kick()
我叫阿黄,谁踢我,找死啊...
b.kick()
我叫黄红义,谁踢我,找死啊...
   

>>>
>>> # Python的魔法方法,它是被Python在特殊的时候自动调用的
>>> # 这些魔法方法有一个特点,就是被双下划线包围
>>> # 比如 __init__(self)
>>> # __init__(self,param1,param2,...) ,是构造方法,实例化对象时自动被调用
>>>

class Ball:
    def __init__(self,name):
        self.name = name
    def kick(self):
        print("我叫%s,谁踢我,找死啊..." %self.name)

b = Ball('土豆')
b.kick()
我叫土豆,谁踢我,找死啊...

>>>

>>># 在Python中定义私有变量或者函数,只需要在名字前加两个下划线"__"

>>> class Person:
    __name = '猪八戒'

>>> p = Person()
>>> p.__name
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    p.__name
AttributeError: 'Person' object has no attribute '__name'

>>>

>>># 实际上,Python是将 __开头的私有属性和方法的名称改编成了 _类名__变量名
>>> # 从这一点可以看出,Python的私有化是伪私有

>>> class Person:
    __name = '猪八戒'
    def getName(self):
        return self.__name

>>> p = Person()
>>> p.getName()
'猪八戒'
>>>
>>> p._Person__name
'猪八戒'

>>> # 继承语法 class DerivedClassName(BaseClassName):
>>> # ......
>>> # 子类可以继承父类的所有方法和属性
>>> # 如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性
>>>
>>>

>>> 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 Shark(Fish):
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('吃货的日子就是这个样子^_^')
                        self.hungry = False
        else :
            print('吃撑了')         

>>> fish = Fish()
>>> fish.move()
我的位置: 6 3

>>> shark = Shark()
>>> shark.move()
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
shark.move()
File "<pyshell#52>", line 6, in move
self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'

# 因为__init__方法被重写,所以没有了 x属性

 # 解决上面的方式有两种方式
>>> # 1, 调用未绑定的父类方法
>>> # 2, 使用super函数 (推荐使用)

class Shark(Fish):
    def __init__(self):
        Fish.__init__(self)  # 调用未绑定的父类方法
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('吃货的日子就是这个样子^_^')

>>> shark = Shark()
>>> shark.move()
我的位置: 3 2
 
>>> class Shark(Fish):
    def __init__(self):
        super.__init__()  # super(),它不用传递self参数
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('吃货的日子就是这个样子^_^')

>>> # 支持多继承
>>> class class DerivedClassName(base1,base2,base3...):

>>>
>>> # 组合: 就是把类实例化,放到一个新类里面
>>>
>>> # 举例子说明:现在要定义一个类,叫水池,水池里面要有乌龟和鱼
>>>

>>>
>>> class Turtle:
    def __init__(self,x):
        self.num = x

>>> class Fish:
    def __init__(self,x):
        self.num = x      

>>> class Pool:
    def __init__(self,x,y):
        self.turtle = Turtle(x)
        self.fish = Fish(y)
    def print_num(self):
        print("水池中有%d只乌龟,%d条鱼" %(self.turtle.num,self.fish.num))

>>>
>>> pool = Pool(2,3)
>>> pool.print_num()
水池中有2只乌龟,3条鱼
>>> 

>>>
>>> # 类中定义的属性都是静态属性
>>> # 类属性和类对象是相互绑定的,并不依赖于实例对象
>>>
>>> # 如果属性名和方法名相同,属性会覆盖方法
>>>
>>> #绑定? Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念
>>>
>>> # 大多时候我们使用的都是实例属性,只有在跟踪类的某些状态时候才使用类属性
>>>
>>>

>>> # 类相关的一些BIF函数
>>> #issubclass(Class,classinfo), 如果Class是classinfo的子类,返回True,否则返回False
>>> # 一个类被认为是其自身的子类
>>> # classinfo可以是类对象组成的元祖,只要class是其中任何一个候选类的子类,返回True
>>>
>>> # object是所有类的基类
>>>

>>> class A:
    pass

>>> class B(A):
    pass

>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> 

# isinstance(object,classinfo) , 实例对象是否属于类的实例对象
>>>
>>> # 如果第一个参数不是对象,则永远返回False
>>> # 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个TypeError异常
>>>

>>> b = B()
>>> isinstance(b,B)
True
>>> isinstance(b,A)
True

>>> # 几个与属性attr 相关的BIF
>>>
>>> # hasattr(object,name) # 对象是否拥有某个属性

>>> class C:
    def __init__(self,x=0):
        self.x = x

>>> c1 = C()
>>> hasattr(c1,"x")
True

>>> # getattr(object,name[,default]) ,获取对象指定的属性值,如果属性不存在,打印default指定的值

>>> getattr(c1,"y","你访问的属性不存在...")
'你访问的属性不存在...'
>>> 

>>> # setattr(object,name,value), 设置对象的属性值,如果属性不存在,则新建这个属性并且设置为value指定的值

>>> setattr(c1,'y','yangw')
>>> getattr(c1,'y',"你访问的属性不存在...")
'yangw'
>>> 

>>>
>>> # delattr(object,name) ,删除对象的属性,如果属性不存在则抛出异常

>>> delattr(c1,'y')
>>> delattr(c1,'y')
Traceback (most recent call last):
  File "<pyshell#106>", line 1, in <module>
    delattr(c1,'y')
AttributeError: y
>>> 

>>>

>>> #*********这个属性是很有用的 ********

>>> property(fget=None,fset=None,fdel=None,doc=None) ,它是通过属性设置属性
>>># 第一个参数是 获取属性的方法,第二个参数是设置属性的方法,第三个参数是删除属性的方法

>> class C:
    def __init__(self,size = 10):
        self.size = size
    def getSize(self):
        return self.size
    def setSize(self,value):
        self.size = value
    def delSize(self):
        del self.size
    x = property(getSize,setSize,delSize)

>>> c = C()
>>> # 这时我们可以利用x来设置size的值
>>> c.x=20  # 会调用 setSize方法
>>> c.getSize()
20
>>> c.size   # 会调用 getSize方法
20
>>> del c.x #会调用  delSize方法

>>> c.size  # 属性已删除,再执行就会抛出异常

Traceback (most recent call last):
  File "<pyshell#136>", line 1, in <module>
    c.size
AttributeError: 'C' object has no attribute 'size'
>>> 

Python学习笔记008_类_对象_继承_组合_类相关的BIF的更多相关文章

  1. python学习之路---day20--面向对象--多继承和super() 函数

    一:python多继承 python多继承中,当一个类继承了多个父类时候,这个类拥有多个父类的所欲非私有的属性 l例子: class A: pass class B(A): pass class C( ...

  2. Python学习笔记之—— File(文件) 对象常用函数

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...

  3. python学习笔记:第20天 多继承、MRO C3算法

    目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...

  4. python学习笔记(二十四)继承与封装

    继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...

  5. Python学习笔记7:函数对象及函数对象作參数

    一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给 ...

  6. Python学习笔记(1)对象类型

    强制转换字符串函数str 如果我们求2的一百万次方是多少那么我们可以 print(2**1000000) 如果我们要求2的一百万次方有多少位那么我们可以用str函数强制转换成字符串然后len函数计算 ...

  7. Python学习笔记_我的参考网址

    Python学习笔记, 下面记录网上搜到的可参考的网址: 一.关于Tkinter 1.Python3中tkinter模块使用方法详解 https://blog.csdn.net/Fighting_Bo ...

  8. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  9. Python学习笔记_Python对象

    Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...

随机推荐

  1. js 获取当前日期所在周的周一

    function week(date,n) { var checkDate = StringToDate(date); checkDate.setDate(checkDate.getDate() + ...

  2. Notepad++使用图解

    Notepad++使用图解.. Notepad++的安装部分 -------------- -------------- --------------- -------------- -------- ...

  3. vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  4. Linux+.NetCore+Nginx搭建集群

    本篇和大家分享的是Linux+NetCore+Nginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话 ...

  5. C / C++ 运行环境搭建教程

    C / C++ 运行环境搭建教程 一.实验环境 本机操作系统:Windows 7 64位 虚拟机:VMware Workstation 12 pro 虚拟机操作系统:Linux CentOS 7 二. ...

  6. MySQL使用聚合函数查询

    create table `t_grade` ( `id` int , `stuName` varchar (60), `course` varchar (60), `score` int ); in ...

  7. Python练习2

    [之前发布到本人的51cto博客,现转过来] 无意看到老男孩的博文:合格linux运维人员必会的30道shell编程面试题及讲解 http://oldboy.blog.51cto.com/256141 ...

  8. POI设置excel某列值为文本格式

    excel单元格格式默认为[常规],当某列限定必须从下拉框选择一个纯数字文本的时候,必须将单元格格式设置为[文本]. 否则即使输入的值和下拉框的一致,excel都认为输入的值是常规类型,而下拉框的值为 ...

  9. 在Windows上使用Ubuntu共享的打印机

    Ubuntu下使用cups共享打印机, 是一种简单易用的方法.CUPS(Common UNIX Printing System,通用Unix打印系统)是Fedora Core3中支持的打印系统,它主要 ...

  10. 读取Execl表 导入数据库

    不知不觉博客园园林都两年多了,我是今年毕业的应届生,最近公司项目需要改动,很多的数据需要导入,很多的实体类需要些.考虑到这些问题自己写了两个winform版的小工具,一个是读取Execl数据导入数据库 ...