首页 > 编程语言 > 详细

python入门(十四):面向对象(属性、方法、继承)

时间:2019-04-23 10:50:16      阅读:155      评论:0      收藏:0      [点我收藏+]
任何东西
1)属性(特征:通常可以用数据来描述)
(类变量和实例变量)
2)可以做一些动作(方法)

类来管理对象的数据。
属性:类变量和实例变量(私有变量)
方法:
    1)实例方法
    2)类方法
    3)静态方法
 
面向对象和函数管理数据:
 类:
专有数据(可以存储,和对外使用)
方法(用于操作专有数据的),实现操作数据的规则。

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

class compute:

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

    def add(self):

        return self.a+self.b

def add(a,b):
    return a+b

#print(add(1,2))
c= compute(1,2)
print(c.add())

c.a+=1
c.b+=1
print(c.a)
print(c.b)

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

    def __init__(self,name,gender):
        技术分享图片self.name = name
        self.gender = gender

    def get_name(self):#实例方法,必须要实例化
        return 技术分享图片self.name

#print(Person("吴老师","Male").get_name())#只能使用一次(连着写,没有存到变量里,使用一次就消失了)
wulaoshi = Person("吴老师","Male")#实例化
print(wulaoshi.get_name())
----------------
 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):
        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 #类变量
    nation = "中国"

    def __init__(self,name,gender):
        技术分享图片self.name = name
        self.gender = gender
        Person.count +=1

    def get_name(self):#实例方法,必须要实例化
        return 技术分享图片self.name

    #类方法:可以使用类变量,不能使用实例变量
    #通过类名来使用,类名.get_instance_count()
    #也可以通过实例调用,实例对象.get_instance_count()
    @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
        

#只能使用一次
#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())
 
 三种方法的区别:
1 实例方法,参数要有self,必须通过实例化的对象去调用。
2 类方法,要加上@classmethod来声明,参数至少有一个,
一般定义为cls,只能使用类变量,不能使用实例变量。
通过类名或者实例对象调用。
3 静态方法,要加上@staticmethod来声明,可以没有参数,
使用类变量,不能使用实例变量。
通过类名或者实例对象调用。
 

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

 

 @staticmethod   #静态方法:不需要self和cls
    def get_more():
        Person.count +=100
        return Person.count
print(Person("吴老师","Male").get_more())
 
单继承
 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("吴老师","男")
print(技术分享图片cp.name)
print(cp.gender)
print(cp.get_name())
print(cp.count)
继承:子类具备所有父类的共有变量和共有方法
如果子类没有定义__init__构造方法,会自动调用父类的。
 

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

 

扩展
 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 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.color)

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

多继承:在括号里面写上多个基类(父类)
子类的构造函数,如果没有实现,则调用第一个基类的构造
函数。
"""
-------------
 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)
print(cp.get_name())
print(cp.fly())
 
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())
 
---------------
 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)
 
 
 
 
    p  -->get_name
   Person                Bird-->get_name
          ChinaBirdPerson

cp.get_name() 
 
 
py3都是新式类,深度优先,没有经典类
 class P:
    #def get_name(self):
    #    return "P name!"    
    pass

class 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("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):
        Person.__init__(self,name,gender)
        #Bird.__init__(self,color)

    def get_gender(self):
        return self.gender

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



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

多继承:在括号里面写上多个基类(父类)ChinaBirdPerson(Person,Bird)
子类的构造函数,如果没有实现,则调用第一个基类的构造
函数。
"""
多继承的时候同名方法,会进行深度优先的查找。
 
 
技术分享图片
 MRO方法解析表确实P在在前面
 
 

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

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

python入门(十四):面向对象(属性、方法、继承)

原文:https://www.cnblogs.com/suitcases/p/10561955.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!