1、任何东西
1)属性(特征:通常可以用数据来描述)
(类变量和实例变量)
2)可以做一些动作(方法)

类来管理对象的数据。
属性:类变量和实例变量(私有变量)
方法:
    1)实例方法
    2)类方法
    3)静态方法

 
2、面向对象和函数管理数据:

 类:
有专有数据(可以存储,和对外使用)
方法(用于操作专有数据的),实现操作数据的规则。

函数:
无专有数据,谁给他传值都可以处理,并返回
本身不能存储数据。

class compute:    #定义了类compute

def __init__(self,a,b):
        self.a = a
        self.b = b

def add(self):    #方法是对输入的数进行的操作,说明已经存储

return self.a+self.b

def add(a,b):    #定义了函数add()
    return a+b

#print(add(1,2))
c= compute(1,2)    #类具备存储的功能
print(c.add())

print(c.a)                          #可以查看当时输入的数据,因为已经存储

print(c.b)                          #可以查看当时输入的数据,因为已经存储

print(c.a+1)                        #可以对输入的数据进行更改

print(c.b+1)                        #可以对输入的数据进行更改

c.a+=1                               #可以对输入的数据进行赋值

print(c.a)

c.b+=1         #可以对输入的数据进行赋值

print(c.b)

运行结果:

E:\>python a.py

3

3

1

2

2

3

2

3

 类:作为一个整体,
把一组相关数据放到类的实例里面,进行存储、计算等实现安全性、独立性,规则的操作统一。

3、实例方法
 class Person:

def __init__(self,name,gender):
        self.name = name
        self.gender = gender

def get_name(self):#实例方法,必须要实例化
        return self.name

print(Person.get_name())         #不能直接通过类名调用实例方法。

原因:实例方法未经过实例化,仅仅通过类名找到了调用方法,但是执行该方法时,找self的值时,没有,所以找不到实例的数据。

#print(Person("吴老师","Male").get_name())#只能使用一次(连着写,没有存到变量里,使用一次就消失了)
wulaoshi = Person("吴老师","Male")        #将实例化存到一个变量中
print(wulaoshi.get_name())    #调用变量中的实例方法

 
4、类方法
 class Person:
    count = 0 #类变量

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1

def get_name(self):#实例方法,必须要实例化
        return self.name

#类方法:可以使用类变量,不能使用实例变量(参数没有self,找不到实例的地址,因此不能用实例变量。)

#通过类名来使用,类名.get_instance_count()
#也可以通过实例调用,实例对象.get_instance_count()
    @classmethod    #装饰器
    def get_instance_count(cls):    #类方法,cls不必非得是cls,但建议用cls
        return Person.count      #类方法是可通过类名,直接调用该方法    

#只能使用一次
#print(Person("吴老师","Male").get_name())
#wulaoshi = Person("吴老师","Male")#实例化
#print(wulaoshi.get_name())
#print(Person.count)
#Person("吴老师","Male")
#print(Person.count)
#print(Person.get_instance_count())

print(Person("吴老师","Male").get_instance_count())#通过实例对象调用类方法
 

可以在类方法中创建实例:

class Person:

count=0

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count += 1

def get_name(self):

return self.name

@classmethod                                #装饰器

def get_instance_count(cls):           #类方法

return Person.count

@classmethod

def create_a_instance(cls):

return Person("zhang","male")

print(Person.create_a_instance())

运行结果:

E:\>python a.py

<__main__.Person object at 0x0000020602080588>

5、静态方法
 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):    #构造方法
        self.name = name
        self.gender = gender
        Person.count +=1

def get_name(self):#实例方法,必须要实例化
        return self.name

@classmethod    #类方法
    def get_instance_count(cls):
        return Person.count

@classmethod    #类方法
    def create_a_instance(cls):
        return Person("张","女")

@staticmethod   #静态方法:不需要self和cls
    def get_nation():
        return Person.nation

 
     @staticmethod   #静态方法:不需要self和cls
    def get_more():
        Person.count +=100
        return Person.count

#只能使用一次
#print(Person("吴老师","Male").get_name())
#wulaoshi = Person("吴老师","Male")#实例化
#print(wulaoshi.get_name())
#print(Person.count)
#Person("吴老师","Male")
#print(Person.count)
#print(Person.get_instance_count())
#print(Person.create_a_instance())
#print(Person("吴老师","Male").get_instance_count())
print(Person.get_nation())
print(Person("吴老师","Male").get_nation())    #通过实例调用静态方法

print(Person("吴老师","Male").get_more())
 
 三种方法的区别:
1 实例方法,参数要有self,必须通过实例化的对象去调用。
2 类方法,要加上@classmethod来声明,参数至少有一个,
一般定义为cls,只能使用类变量,不能使用实例变量。
通过类名或者实例对象调用。
3 静态方法,要加上@staticmethod来声明,可以没有参数,
使用类变量,不能使用实例变量。
通过类名或者实例对象调用。
 

不想做实例化,且只操作类变量的时候:类方法、静态方法
如果想使用实例变量,只能使用实例方法了。

6、单继承

1) 子类没有写构造方法:

 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化
        return self.name

class ChinaPerson(Person):    #子类什么都没有干
    pass  #如果子类没有定义__init__构造方法,会自动调用父类的。

 

cp = chinaPerson()  

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 18, in <module>

cp = chinaPerson()

TypeError: __init__() missing 2 required positional arguments: 'name' and 'gender'

#如果子类没有定义构造方法,会自动调用父类的。所以实例化时,需要两个参数

cp = ChinaPerson("吴老师","男")    #子类实例化
print(cp.name)    #子类中,沿用了父类的name
print(cp.gender)    #子类中,沿用了父类的gender
print(cp.get_name())   #子类中,沿用了父类的方法
print(cp.count)   
 

"""
继承:子类具备所有父类的共有变量和共有方法
如果子类没有定义__init__构造方法,会自动调用父类的。
好处:站在老爸的肩膀上,增加属性,增加方法
在原有的基础上进行扩展。
"""

2) 子类自定义构造方法

class Person:

count = 0                 #count是父类的类变量

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count+=1

print("创建了一个新的人")

def get_name(self):

return self.name

class chinaPerson(Person):

def __init__(self,name,gender):       #子类自定义的构造方法

        self.name = name

        self.gender = gender

def get_gender(self):

return self.gender

cp = chinaPerson("laoshi","男")

print(cp.count)

运行结果:

E:\>python a.py

0

#由于子类自定义了构造方法,而Person.count+=1的语句是在父类的构造方法中,所以在执行子类的实例中,不会进行Person.count+=1,所以输出结果为0

3) 子类写明调用父类构造方法

 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化
        return self.name

class ChinaPerson(Person):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender):
        Person.__init__(self,name,gender)    #子类中写明调用父类的构造方法

def get_gender(self):
        return self.gender

cp = ChinaPerson("吴老师","男")
print(cp.count)       #父类的类变量会加一

 
--------------------------------------------------------------------------------------------------------------

class Person:

count = 0

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count+=1

print("创建了一个新的人")

def get_name(self):

return self.name

class chinaPerson(Person):

def get_gender(self):

return self.gender

cp = chinaPerson("laoshi","男")

print(cp.name)

print(cp.gender)

print(cp.get_name)

print(cp.get_gender())               #可以调用子类自身的方法

运行结果:

E:\>python a.py

创建了一个新的人

laoshi

<bound method Person.get_name of <__main__.chinaPerson object at 0x0000023446930588>>

 
 
7、多继承

在括号里面写上多个基类(父类)

1)子类的构造函数,如果没有实现,则调用第一个基类的构造函数

 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化
        return self.name

class Bird:

def __init__(self,color):
        print("a bird is birthed!")
        self.color = color

def fly(self):
        print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):    #该子类()中有两个基类
      #如果子类没有定义__init__构造方法,会自动调用父类的。
      #该子类没有定义自己的构造函数

def get_gender(self):
        return self.gender

cp = ChinaBirdPerson("吴老师","男")

print(cp.count)
运行结果:
E:\>python a.py
创建了一个新的人   #该子类的实例调用的是第一个父类的构造方法
1

-------------------------------------------------------------------------

print(cp.color)                    #打印第二个基类的参数color

运行结果:

E:\>python a.py

创建了一个新的人

Traceback (most recent call last):

File "a.py", line 32, in <module>

print(cp.color)

AttributeError: 'chinaBirdPerson' object has no attribute 'color' #子类没有color对象

原因:虽然子类能够继承过来Bird这个基类但是没有进行Bird的初始化,所以不会调用。

因为子类没有构造函数的情况下,则调用第一个基类的构造函数。

 
2) 子类的构造函数,将两个基类都进行初始化,都继承
 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")

def get_name(self):#实例方法,必须要实例化
        return self.name

class Bird:

def __init__(self,color):
        print("a bird is birthed!")
        self.color = color

def fly(self):
        print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender,color):    #子类的构造函数的参数的数量可任意,不必与基类的参数数量保持一致
        Person.__init__(self,name,gender)    #子类中调用了第一个基类的构造方法
        Bird.__init__(self,color)         #子类中调用了第二个基类的构造方法

def get_gender(self):
        return self.gender

cp = ChinaBirdPerson("吴老师","男","红色")

print(cp.color)

运行结果:

E:\>python a.py

创建了一个新的人          #初始化基类1

Bird is birthed              #初始化基类2

red                       #可以打印基类2的变量

 
java里面是没有多继承的,但是有多个接口
-------------------------------------------------------------------------------------------------------------
 class Person:
    count = 0 #类变量
    nation = "中国"

def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")

class Bird:

def __init__(self,color):
        print("a bird is birthed!")
        self.color = color

def fly(self):
        print("I can fly in the sky!")

def get_name(self):#实例方法,必须要实例化
        return "bird has no name"

class ChinaBirdPerson(Person,Bird):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender,color):
        Person.__init__(self,name,gender)
        Bird.__init__(self,color)

def get_gender(self):
        return self.gender

cp = ChinaBirdPerson("吴老师","男","红色")
print(cp.get_name())

 
运行结果:

E:\test_test_test>py -3 b.py
创建了一个新的人
a bird is birthed!
bird has no name

-------------------------------------------------
 class ChinaBirdPerson(Person,Bird):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender):
        Person.__init__(self,name,gender)
        #Bird.__init__(self,color)

def get_gender(self):
        return self.gender

cp = ChinaBirdPerson("吴老师","男")
print(cp.color)

 
运行结果:

E:\test_test_test>py -3 b.py
创建了一个新的人
Traceback (most recent call last):
File "b.py", line 36, in <module>
print(cp.color)
AttributeError: 'ChinaBirdPerson' object has no attribute 'color'

3) 子类的两个基类都有相同名字的方法时,调用该方法时,执行括号左面基类的方法,会进行深度优先的规则查找。

class Person:

count = 0

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count+=1

print("创建了一个新的人")

def get_name(self):             #基类1有get_name()方法

return self.name

class Bird:

def __init__(self,color):

print("Bird is birthed")

self.color = color

def fly(self):

print("I can fly in the sky")

def get_name(self):             #基类2有get_name()方法

print("Bird has no name")

class chinaBirdPerson(Person,Bird):

def __init__(self,name,gender,color):

Person.__init__(self,name,gender)

Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = chinaBirdPerson("laoshi","男","红")

print(cp.get_name())

运行结果:

E:\>python a.py

创建了一个新的人      #初始化基类1

Bird is birthed          #初始化基类2

laoshi                 #调用基类1的get_name()方法

4) 多继承时的深度优先

class P:

def get_name(self):         #爷爷类P有get_name()方法

print("P name")

class Person(P):                #父类Person继承了P

count = 0

nation = "中国"

def __init__(self,name,gender):

self.name = name

self.gender = gender

Person.count+=1

print("创建了一个新的人")

class Bird:

def __init__(self,color):

print("Bird is birthed")

self.color = color

def fly(self):

print("I can fly in the sky")

def get_name(self):          #第二父类中有get_name()方法

print("Bird has no name")

class chinaBirdPerson(Person,Bird):

def __init__(self,name,gender,color):

Person.__init__(self,name,gender)

Bird.__init__(self,color)

def get_gender(self):

return self.gender

cp = chinaBirdPerson("laoshi","男","红")

print(cp.get_name())

运行结果;

E:\>python a.py

创建了一个新的人       #基类1初始化

Bird is birthed           #基类2初始化

P name                #深度优先,调用P的get_name()方法

None

多继承的时候同名方法,会进行深度优先的查找。
py3都是新式类,深度优先,没有经典类
 
import inspect
print(inspect.getmro(chinaBirdPerson))    #可以用 inspect.getmro 来获取类的 MRO(方法解析顺序)

 MRO方法解析表确实P在前面
 

当爷爷类有同名方法,并且第二个父类有同名方法时,子类调用方法时,按照深度优先的原则,而非广度优先的原则

 
从父类、爷爷类去查找方法,叫做深度优先
从多继承的同级类去查找方法,叫做广度优先
 
  p  -->get_name(爷爷类)
       Person(父类)                Bird-->get_name(父类)
          ChinaBirdPerson(孙类)

cp.get_name()

 
 
 
 class P:   class P():   class P(object):三种类的定义方法等价
 
 

python入门(十四):面向对象(属性、方法、继承、多继承)的更多相关文章

  1. Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)

    Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...

  2. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  3. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  4. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  5. Python进阶(十四)----空间角度研究类,类与类之间的关系

    Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...

  6. Python 入门 之 初识面向对象

    Python 入门 之 初识面向对象 1.初识面向对象编程 (核心--对象) (1)观察以下代码: # 面向过程编程 s = "alexdsb" count = 0 for i i ...

  7. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  8. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  9. Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...

  10. Python 静态方法、类方法和属性方法

    Python 静态方法.类方法和属性方法 静态方法(staticmethod) staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticm ...

随机推荐

  1. 查看局域网内所有IP的方法

    1,windows下查看局域网内所有IP的方法: 在MS-DOS命令行输入arp -a 2,Linux下,查看局域网内所有IP的方法: 在命令行输入nmap -sP 172.10.3.0/24

  2. 移植mysql到ARM(AM335x)

    一,编译ncurses 编译mysql需要依赖ncurses,先编译ncurses 1.下载ncurses 下载路径是ftp://ftp.gnu.org/gnu/ncurses,选择下载的是ncurs ...

  3. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

  4. 为什么比特币和以太坊未必真得比EOS更去中心化?

    在区块链行业里,有两派人一直在争论:一个是以比特币和以太坊为首的社群,另一个是以EOS为首的社群.这两群人一直在争论谁才是真正的未来,双方都认为自己这边更有未来.其中EOS抗争的重点就是100万TPS ...

  5. [UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade

    From Alpha:开始的颜色透明度 To Alpha:结束的颜色透明度 Duration:过渡所使用的时间(单位:秒) Color:屏幕变化的颜色 Hold when finished:过渡时间结 ...

  6. 关于shiro安全框架实现同一用户同一时刻仅可在一个地址登录的技术实现

    首先,我们要说明一下,本技术点的开发背景是shiro与springMvc结合环境下的开发方式. 由于shiro把用户登录后的信息都存在了自己封装的session中,所以要实现单一地址登录,我们需要关注 ...

  7. Keras bug in model.predict

    When I use Keras to predict behind a web service, it occurred an error. and the error message is lik ...

  8. C# 文字滚动特效(上下滚动)

    本程序改编至网上下载的一个自定义控件,原控件是左右滚动效果,类似于跑马灯效果,由于项目需要,改编为上下滚动. 前期没有实现自动折行,今天刚加上自动折行. using System; using Sys ...

  9. SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数

    这几天写新项目遇到这个问题,看这位博主总结得不错,懒得写了,直接转!原文:http://blog.csdn.net/yixiaoping/article/details/45281721原文有些小错误 ...

  10. Day74

    Django框架之视图函数(day74)一 作业相关 urlpatterns = [   url(r'^$',views.book),  #根路径,响应到指定视图函数:   .....   url(r ...