首页 > 编程语言 >Python的类和对象

Python的类和对象

时间:2022-11-16 14:55:45浏览次数:66  
标签:__ Python self 对象 print slots class 属性

1. 类和对象的定义

  类用class关键字声明,类中的变量成为属性,函数成为方法,定义方法的时候,需要带上self参数。

例:
    class Person:        # 默认继承Object父类,也可以继承Str,Number等父类
        name = 'dog'
        age = 12
        def fav(self):
            print('喜欢跑步。')

    person = Person()          # 实例化类
    person.name                # dog
    person.fav()               # 喜欢跑步

 

2. 类的继承和重写 

类的继承,类B继承类A,继承父类的所有属性和方法
    class  A:
        x = 22
        def name(self):
            print('我是A')
    
    class  B(A):           
        pass

    b = B()
    b.x                    # 22
    b.name()               # 我是A

类的多继承,一个类可以继承多个父类,如果父类中存在相同的方法或属性,则从左往右就近继承
    class D:
        x = 333
        y = 33
        def name(self):
            print('我是D')

    class E(A,D):
        pass

    e = E()
    e.x                        # 22
    e.y                        # 33
    e.name()                   # 我是A

类的重写,类C继承类A,如果类C中存在和父类A相同的属性和方法名,则会重写父类的属性和方法的内容
    class C(A):            
        x = 222
        def name(self):
            print('我是C')

    c = C():
    c.x                    # 222
    c.name                 # 我是C

 

3. 类的组合 

类的组合,即将类作为值赋给另一个类中的属性
    class Dog:
        def say(self):
            print('汪汪汪')
    
    class Cat:
        def say(self):
            print('喵喵喵')

class Animal:
    dog = Dog()
    cat = Cat()

    def say(self):
        self.dog.say()
        self.cat.say()

    Animal().say()                # 汪汪汪   喵喵喵

 

4. self的作用

slef的作用
    class Self:
        x = 22
        def get_self(self):
            return self

    mySelf = Self()
    # 他们的结果都是一样的,说明这个self指的是对象的本身
    print(mySelf.get_self())        # <__main__.self object at 0x000002CB88A9CA08>
    print(mySelf)                   # <__main__.self object at 0x000002CB88A9CA08>

  类实例化对象后方法是共享的,属性是私有的
    mySelf.y = 33
    print(mySelf.y)              # 33,mySelf对象的私有属性y
    
    mySelf1 = Self()
    mySelf1.x                    # 22  x是共有属性,是实例化类的
    mySelf1.y                    # AttributeError: 'self' object has no attribute 'y'

    mySelf1.z = 44
    print(mySelf1.z)             # 44,z是mySelf对象的私有属性

    查看对象的内部私有属性
    mySelf.__dict__              # {'y': 33} 
    mySelf1.__dict__             # {'z': 44}

 

5. 类的私有变量

1.以__下划线命名,表示这是私有变量,外部无法正常去访问
2.但是,他并不是一个真正的私有变量,他还是可以被外部访问到,只是被偷偷修改了名称
我们可以通过_类名+变量名来访问并操作值,并不建议
3._单个下划线开头的变量:代表仅供类内部使用的变量,约定俗成
例:
    class private:
        def __init__(self, x):
            self.x = x

        def set_x(self, x):
            self.__x = x
        
        def get_x(self):
            print(self.__x)

    myPrivate = private(100)
    print(myPrivate.__x)        # 无法访问对象的内部私有属性值
    
    通过内省,类内部的__x被改名为_private__x
    myPrivate.__dict__            # {'_privateVariable__x': 100}
    print(myPrivate._private__x)        # 100

    通过内部方法去修改值
    myPrivate.set_x(200)
    通过内部的方法去访问
    myPrivate.get_x()        # 200

    也可以直接通过_类名+私有属性名的方式直接修改值
    myPrivate._private__x = 300
    myPrivate.get_x()        # 300

不能通过动态添加对象属性的方法来增加类的属性
    1. 直接通过添加变量的方式
    myPrivate.y = 666
    2. 通过字典的属性添加对象的属性__dict__[key] = value
    myPrivate.__dict__['z'] = 888
    查看属性,发现属性的命名为发声改变,说明命名重写只发生在类内部产生的时候
    print(myPrivate.__dict__)    # {'_privateVariable__x': 300, 'y': 666, 'z': 888}

    进一步验证,将类实例化另一个对象,并没有发现y和z的属性
    myPrivate1 = private(1)
    print(myPrivate1.__dict__)    # {'_privateVariable__x': 1}

__slots__方法,限制对象可动态添加的属性,避免内存泄漏浪费
    class Slots:
        __slots__ = ['x', 'y']
        
        def __init__(self, x):
            self.x = x

    slots = Slots(100)
    print(slots.__dict__)        # 报错,使用了__slots__方法就不存在__dict__方法了
    print(slots.__slots__)        # ['x', 'y']  通过__slots__获取

    可以添加__slots__中定义的属性名称,不可以随意添加
    slots.y = 200        # 添加y属性
    slots.z = 300        # 报错,因为__slots__不包含z属性

    slots的继承
    class S(Slots):
        pass
    
    s = S(666)
    print(s.x)        # 666    继承了父类的属性
    s.z = 777
    print(s.z)        # 777    可以添加自己的属性
    print(s.__dict__)        # {'z': 777}
    print(s.__slots__)        # ['x', 'y']

 

标签:__,Python,self,对象,print,slots,class,属性
From: https://www.cnblogs.com/chf333/p/16895906.html

相关文章

  • c++调用python
    cmakelistscmake_minimum_required(VERSION3.20)project(python_test)set(PYTHON_INCLUDE_DIRS"/home/ubuntu/miniconda3/envs/python38/include/python3.8")INCLUD......
  • windows下开机自启python服务
    一、编辑statrtRunRecService.bat文件@echooffcallactivateD:\applications\Anaconda\envs\py_36_flaskechopwddiris%cd%cd/dD:\work_dwy\AisaBankRecon......
  • 习题整理【Python】
    习题整理【Python】​​前言​​​​Python​​​​Python_1​​​​Python_2​​​​Python_3​​​​Python_4​​​​Python_5​​​​Python_6​​​​Python_7​​​​......
  • 微软开源最强Python自动化神器Playwright!不用写一行代码!自动生成代码还竟然如此流畅!妈
    安装#安装playwright库pipinstallplaywright#安装浏览器驱动文件python-mplaywrightinstall#再安装playwrightinstall要求:python版本3.7+使用Playwright无需写一行......
  • 【Python基础】科学计算库Scipy简易入门
    0.导语Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy......
  • 08python元组
    这一篇问文章主要介绍元组的相关知识。元组:不可修改的序列与列表一样,元组也是序列,唯一的差别在于元组是不能修改的(同样的,字符串也不能修改)。元组的语法很简单。>>>......
  • Python 操作MySQL
    目录pymysql的使用起手式--Python连接MySQL的几种方式:1.方式一:config+db+cur.execute(变量替换)2.方式二:conn+execute(sql)3.方式三pandas+config+db+read_sql4.方式......
  • 关于python文件操作(转)
    最近想把Excel转为xml文件,所以就在网上找了一些excel的访问库,结果发现了一个python的excel库,但是自已不知道python是怎么把文本写入硬盘的。所以在网上找到了这个python关于......
  • python-面相对象封装案例-笔记
    目标封装小明爱跑步存放家具01.封装封装 是面向对象编程的一大特点面向对象编程的 第一步 ——将 属性 和 方法 封装 到一个抽象的 类 中外界 使用 类 创建......
  • python-面相对象封装案例Ⅱ-笔记
    目标士兵突击案例身份运算符封装封装 是面向对象编程的一大特点面向对象编程的 第一步 ——将 属性 和 方法 封装 到一个抽象的 类 中外界 使用 类 创建 对......