Python面向对象设计(第六章)

1. 类和对象

类是抽象的概念,对象是实例化的概念

类的定义:

class 类名:             等价于         

class  类名(object):         等价于          (派生其他基类,多个用‘,’隔开)

class 类名():

类的实例化对象:直接赋值

对象名=类名()

通过对象名。方法来引用类的成员 

注:类名规范,首字母大写,在声明类时后面

2. 成员

访问类型:公有数据成员与私有数据成员

定义:以_ _(两个下划线)开头且不以_ _(两个下划线)结束的成员表示为私有成员,否则为公有成员

一般只能在类内使用(在类外不能直接被访问,Python对私有成员提供严格的访问保护机制),类外访问:

对象名 . _类名_ _私有成员(也就是调用对象的公有成员方法来访问),例 :

class Test:
    public=13                       #公有成员属性
    __private=12                    #私有成员属性
    print('内部访问',__private)

test=Test()
print('外部访问',test._Test__private)          #外部访问(不建议使用的)
print('公有成员直接访问',Test.public)

_xxx:以一个下划线开头,保护成员

__xxx:以两个下划线开头,表示为私有成员。

__xxx__:前后各两个下划线,定义为特殊成员(例:构造器等)。

" . "表示成员访问运算符,可以用来命名空间,模块或对象中的成员。

数据成员

对象数据成员:

定义:对象数据成员主要在构造方法__init__() )中定义,定义和在实例方法中访问以self作为前缀

类数据成员:

类的数据成员不在任何成员方法中,是类所有对象共享的,不属于任何一个对象

class MemberTest:
    classValue=2            #类的数据成员
    def __init__(self):     #构造器(特殊成员,特殊方法)
        self.value=1        #对象的成员

testMembet=MemberTest()     #实例化(创建对象)
MemberTest.classValue       #类的数据成员可以通过类或对象名访问
print(testMembet.classValue)
print(testMembet.value)     #对象成员只能通过对象名访问

注:程序中或类的外部,对象的数据成员只能通过对象名访问; 类的数据成员可以通过类名或对象名访问

方法成员:动作

方法成员和数据成员差不多,分为有公有方法、私有方法、静态方法、类方法。公有方法和私有方法(公有成员与私有成员)一般指属于对象的实例方法,其中私有方法名字以两个下划线’__‘开始。

普通实例方法,必须以self作为第一个参数

@classmethod:声明类方法(修饰器)

@staticmethod:声明静态方法(静态方法可以没有参数)

class Root:
    __value=1
    def show(self):
        print('普通方法',self.__value+1)        #私有成员属性在普通实例方法中的访问必须self.

    @classmethod
    def classShow(cls):
        print('类方法',cls.__value+2)          #私有成员属性在类方法中的访问必须self.

    @staticmethod
    def staticSow():
        print('静态方法')

root=Root
root.show(root)                                #普通实例方法访问实例成员时可以通过对象
root.classShow()
root.staticSow()

属性

属性是一种特殊形式的成员方法,综合了公开数据成员和成员方法(python中支持更加全面的保护机制,设置属性为只读,无法修改,删除,增加成员)

语法1:

class 类名:

        @property                   #方法转为属性

        def 方法名(self):      #方法名,该名称最后将作为创建的属性名

                 方法体                 #实现的具体功能,通常以return语句结束,用于返回计算结果

 语法2:

         class 类名:

                  def  方法1():

                  def  方法2():

                  ……

                  属性名=property(方法1,方法2,……)

且定义的属性不能修改,不能删除 ,例:

class AttributeTest:
    @property                   #修饰器,定义属性(也就是方法转为属性),且定义的属性不能修改,不能删除
    def test(self):
        return self.value
    def __init__(self,values):
        self.value=values
att=AttributeTest(4)
print(att.test)                 #属性名,不是方法
del att.test                    #不能删除
att.value(att)

将属性设置为可读,可修改,可删除的属性,例: 

class Test:
    def __init__(self,values):
        self.value=values                #注意下这里是公有成员value
    def get(self):                       #读取公有成员
        return self.value
    def set(self,v):                     #修改公有成员
        self.value=v
    def dell(self):
        del self.value
    vl=property(get,set,dell)            #定义属性(可读可写),指定相应读写方法
test=Test(3)
print(test.vl)
test.vl=5                                #修改属性值
print(test.vl)
del test.vl                              #删除属性
print(test.vl)

3. 继承

继承是一种设计复用和代码复用的机制(也就是减少重用性)。

在继承关系中,已有的,设计好的类称为父类基类新设计的类称为子类或派生类(派生类可以继承父类的公有成员,不能继承私有成员)

如果需要在派生类调用基类的方法,使用内置函数super(),或通过基类名 . 方法名()的方式实现

例:

class Person(object):               # object是已经设计好的类即:父类或基类,可简写成class Person:
    def __init__(self):
        self.setName='哈哈'
        self.setAge='18'

    def getName(self):
        return self.setName

class Sun(Person):                  # Person是新建立的类:派生类(子类)
    def __init__(self):
        super().__init__()          # 通过super()调用,不能有self参数
        #Person.__init__(self)      # 通过父类(基类)调用父类方法,self参数不能省略
        self.id=1

    def show(self):
        print(self.id,self.setName,self.setAge)

sun=Sun()
sun.show()

4. 特殊方法

前面介绍:__xxx__前后各两个下划线,定义为特殊成员(即特殊方法)

__init__:构造方法(创建对象时,最先执行的方法,可用来初始化)

__del__:析构方法(创建对象,最后执行的方法,可用来释放对象,进行清理工作)

 

发布了59 篇原创文章 · 获赞 3 · 访问量 4767

猜你喜欢

转载自blog.csdn.net/CDZAllier/article/details/100970839