九、Python 面向对象

1、Python3 面向对象

     1)类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
     2)方法:类中定义的函数。
     3)类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    4)数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
    5)方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
    6)局部变量:定义在方法中的变量,只作用于当前实例的类。
    7)实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
    8)继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
      例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
    9)实例化:创建一个类的实例,类的具体对象。
   10)对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

2、类定义 

语法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
 

3、类对象

类对象支持两种操作:属性引用和实例化
属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
类对象创建后,类命名空间中所有的命名都是有效属性名

class Dog:
    #定义基本属性
    name = ''      # 狗的名称
    color = ''     # 狗的颜色
    #两个下划线开头  定义私有属性,私有属性在类外部无法直接进行访问
    __kind = ''      # 狗的品种

    #构造方法
    def __init__(self,name,color,kind):
       self.name = name
       self.color = color
       self.kind = kind

    #打印信息
    def printInfo(self):
        print('狗的品种是:',self.kind)

4、继承

语法格式:
class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    1)需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 
即方法在子类中未找到时,从左到右查找基类中是否包含方法。

     2)BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,
基类定义在另一个模块中时这一点非常有用

class SubDog(Dog):
    price = .0   #狗的价格

    #初始化
    def __init__(self,name,color,kind,price):
        Dog.__init__(self,name,color,kind)
        self.price = price

    #覆写父类方法(重写)
    def printInfo(self):
        print('狗的品种是:',self.kind,',价格为',self.price)

 5、多继承

 语法格式:
    class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    注意:
        尽量避免使用多继承,因为父类有相同的变量和方法,则会按照继承的顺序,
    从左到右依次匹配相应的变量和方法,导致获取的不是自己想要的

 

#参加跳舞比赛
class Dance():
    danceName = ''   #舞蹈名称
    sort = 0    #舞蹈获取的名次
    #初始化
    def __init__(self,name,sort):
        self.danceName = name
        self.sort = sort

    #比赛结果
    def result(self):
        print('我参加比赛的舞蹈名为: %s,获得第%s名'%(self.danceName,1))

#多继承
class SpeakDog(SubDog,Dance):
    isSpeak = False
    def __init__(self,name,color,kind,price,danceName,sort,isSpeak):
        SubDog.__init__(self,name,color,kind,price)
        Dance.__init__(self,danceName,sort)
        self.isSpeak = isSpeak

    def printInfo(self):
        if self.isSpeak:
            print('%s是一只会叫的狗' % self.name)
        else:
            print('%s是一只不会叫的狗' % self.name)

6、类属性与方法

1)类的私有属性
    __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

2)类的方法
    在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,
且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

3)类的私有方法
    __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

#类的私有属性实例
class CounterTest:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量

    def count(self):            # 公共方法
        self.__secretCount += 1
        self.publicCount += 1
        print('这是公共方法,私有变量__secretCount的值为:',self.__secretCount)

    def __addNum(self,a,b):    # 私有方法
        return a+b

counter = CounterTest()
counter.count()
print('公有变量publicCount的值为:',counter.publicCount)
# print(counter.__secretCount)  # 报错,实例不能访问私有变量


#程序入口
if __name__ == '__main__':
    # 实例化类
    dog = Dog('小黑','黑色','哈士奇')
    print(dog.name, dog.color, dog.kind)

    subDog = SubDog('小布丁','棕色','泰迪',1239.2)
    subDog.printInfo()  #子类调用重写方法
    print("调用父类重写的方法:",end='')
    super(SubDog,subDog).printInfo()  #用子类对象调用父类已被覆盖的方法

    speakdog = SpeakDog('小布丁','棕色','泰迪',1239.2,'恭喜发财',1,True)
    speakdog.printInfo()
    speakdog.result()

7、给各位大佬奉茶

    测试笔记

#1、Python3 面向对象
print()
print('1、Python3 面向对象')
'''
1)类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
2)方法:类中定义的函数。
3)类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
4)数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
5)方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
6)局部变量:定义在方法中的变量,只作用于当前实例的类。
7)实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
8)继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
9)实例化:创建一个类的实例,类的具体对象。
10)对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

'''
# 2、类定义
print()
print('2、类定义')
'''
语法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
'''
# 3、类对象
print()
print('3、类对象')
'''
    类对象支持两种操作:属性引用和实例化。
属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
类对象创建后,类命名空间中所有的命名都是有效属性名
'''
class Dog:
    #定义基本属性
    name = ''      # 狗的名称
    color = ''     # 狗的颜色
    #两个下划线开头  定义私有属性,私有属性在类外部无法直接进行访问
    __kind = ''      # 狗的品种

    #构造方法
    def __init__(self,name,color,kind):
       self.name = name
       self.color = color
       self.kind = kind

    #打印信息
    def printInfo(self):
        print('狗的品种是:',self.kind)


# 4、继承
'''
语法格式:
class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    1)需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 
即方法在子类中未找到时,从左到右查找基类中是否包含方法。

     2)BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,
基类定义在另一个模块中时这一点非常有用
'''
class SubDog(Dog):
    price = .0   #狗的价格

    #初始化
    def __init__(self,name,color,kind,price):
        Dog.__init__(self,name,color,kind)
        self.price = price

    #覆写父类方法(重写)
    def printInfo(self):
        print('狗的品种是:',self.kind,',价格为',self.price)

#5、多继承
'''
语法格式:
    class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    注意:
        尽量避免使用多继承,因为父类有相同的变量和方法,则会按照继承的顺序,
    从左到右依次匹配相应的变量和方法,导致获取的不是自己想要的
'''
#参加跳舞比赛
class Dance():
    danceName = ''   #舞蹈名称
    sort = 0    #舞蹈获取的名次
    #初始化
    def __init__(self,name,sort):
        self.danceName = name
        self.sort = sort

    #比赛结果
    def result(self):
        print('我参加比赛的舞蹈名为: %s,获得第%s名'%(self.danceName,1))

#多继承
class SpeakDog(SubDog,Dance):
    isSpeak = False
    def __init__(self,name,color,kind,price,danceName,sort,isSpeak):
        SubDog.__init__(self,name,color,kind,price)
        Dance.__init__(self,danceName,sort)
        self.isSpeak = isSpeak

    def printInfo(self):
        if self.isSpeak:
            print('%s是一只会叫的狗' % self.name)
        else:
            print('%s是一只不会叫的狗' % self.name)


#6、类属性与方法
'''
1)类的私有属性
    __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

2)类的方法
    在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,
且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

3)类的私有方法
    __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods
'''

#类的私有属性实例
class CounterTest:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量

    def count(self):            # 公共方法
        self.__secretCount += 1
        self.publicCount += 1
        print('这是公共方法,私有变量__secretCount的值为:',self.__secretCount)

    def __addNum(self,a,b):    # 私有方法
        return a+b

counter = CounterTest()
counter.count()
print('公有变量publicCount的值为:',counter.publicCount)
# print(counter.__secretCount)  # 报错,实例不能访问私有变量


#程序入口
if __name__ == '__main__':
    # 实例化类
    dog = Dog('小黑','黑色','哈士奇')
    print(dog.name, dog.color, dog.kind)

    subDog = SubDog('小布丁','棕色','泰迪',1239.2)
    subDog.printInfo()  #子类调用重写方法
    print("调用父类重写的方法:",end='')
    super(SubDog,subDog).printInfo()  #用子类对象调用父类已被覆盖的方法

    speakdog = SpeakDog('小布丁','棕色','泰迪',1239.2,'恭喜发财',1,True)
    speakdog.printInfo()
    speakdog.result()

结果:

C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\python.exe F:/python-space/test/ObjectStudy.py

1、Python3 面向对象

2、类定义

3、类对象
这是公共方法,私有变量__secretCount的值为: 1
公有变量publicCount的值为: 1
小黑 黑色 哈士奇
狗的品种是: 泰迪 ,价格为 1239.2
调用父类重写的方法:狗的品种是: 泰迪
小布丁是一只会叫的狗
我参加比赛的舞蹈名为: 恭喜发财,获得第1名

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章