美文网首页
Python中类、对象和继承相关知识

Python中类、对象和继承相关知识

作者: 锤子爱砸房子 | 来源:发表于2017-10-27 21:14 被阅读0次

    定义类并创建对象

    在Python中定义类的写法为:class 类名:即可定义出一个类(注意:类名首字母大写)

    由类创建对象的写法为变量名 = 类名()

    Python中的属性

    Python中的属性可分为两类:

    1.类属性:由类来维护的属性,对象在访问这种属性时,访问的是同一个值(即,对象的共有财产)

    2.实例属性:通过类创建出来的对象拥有,每个对象都维护自己独有的属性

    可以将类属性理解为公有属性,实例属性理解为私有属性

    类属性写法:直接在类中添加属性名和属性值

    class Student:
        country = 'china' # 类属性
    stu1 = Student()
    

    实例属性写法:实例属性定义在__init__函数里面,且该函数接收的第一个参数(一般写为self)是指针类型且永远指向该类创建出来的某个对象(即,通过类创建对象的时候,指针指向就确定了),函数接收的其它参数为创建对象时所需的形参

    class Student:
        country = 'china'
        def __init__(self, name, age):
            self._name = name # 实例属性_name
            self._age = age # 实例属性_age
    stu1 = Student('李四', '18')
    

    __init__函数在调用类创建对象过程中会自行调用执行,不需要手动调用__init__函数

    Python中的方法

    Python中的方法可分为三类:

    1.类方法:属于类的方法,由类来维护(对象的公有财产)

    2.实例方法:属于对象的方法,由对象自己维护的方法(对象的私有财产)

    3.静态方法:函数占据了类的命名空间,调用时需要通过类名+方法名才能调用。静态方法和通过该方法创建出来的对象没有任何关系

    可以将类方法理解为公有方法,实例方法为私有方法

    只有是没有调用过类、对象下的属性,就可以声明为静态方法

    类方法的写法:通过系统装饰器@classmethod声明函数为类方法,且该函数接收的第一个参数(一般写为cls)是指针类型,指向的是类本身,类方法只能访问类属性,不能访问实例属性。函数接收的其它参数为创建对象时所需的形参

        @classmethod
        def say(cls):
            print('我来自:' + cls.country)
            
            # print('我来自:' + cls._age)
            # 报错:AttributeError: type object 'Student' has no attribute '_age'
            
    stu1.say() # 我来自:china
    

    实例方法的写法:直接在类里添加函数,不需要装饰器修饰,其它写法和类方法一样,第一个参数一般写为self用以区分。实例方法既访问类属性,也能访问实例属性

        def hello(self):
            print('我的祖国是:' + self.country)
            print('我叫:' + self._name)
    
    stu1.hello() # 我的祖国是:china    我叫:李四
    

    静态方法的写法:通过系统装饰器@staticmethod声明函数为类方法

        @staticmethod
        def soy():
            print('我是打酱油的')
            
    Student.soy() # 我是打酱油的
    

    创建一个简单的类

    class Student:
        country = 'china'
        def __init__(self, name, age):
            self._name = name
            self._age = age
    
        @classmethod
        def say(cls):
            print('我来自:' + cls.country)
    
        def hello(self):
            print('我的祖国是:' + self.country)
            print('我叫:' + self._name)
    
        @staticmethod
        def soy():
            print('我是打酱油的')
    
    stu1 = Student('李四', '18')
    stu1.say()
    stu1.hello()
    Student.soy()
    

    特性:property

    特性作用及写法

    作用:如果调用特性,则用户只能访问,不能设置;隐藏真实的实例属性,防止用户乱更改或误操作

    写法:通过系统装饰器@property声明函数

    class Circle:
        def __init__(self, r):
            self._r = r
            
        @property
        def r(self):
            return self._r
    
    cir = Circle(10);
    print(cir.r)
    

    设置器作用及用法

    作用:专门提供给特性使用,用来修改特性的值

    写法:通过系统装饰器@特性名.setter声明函数

        @r.setter
        def r(self, num):
            if type(num) is int:
                self._r = num
            else:
                print('请设置整数值')
                
    cir.r = 20
    

    删除器作用及写法

    作用:通过del删除某个特性时,如果定义了删除器,该操作会执行删除其中的代码

    写法:通过系统装饰器@特性名.deleter声明函数

        @r.deleter
        def r(self):
            print('can not delete')
            
    del cir.r # 不加删除器会报错:AttributeError: can't delete attribute
    

    属性私有化

    让当前类的私有属性不会被子类继承到

    Python中私有化机制:是属性名改写。在所有需要私有化的属性前添加__,则该属性名就会变成:_类名__属性名

    class Student:
        def __init__(self):
            self.__name = '张三'
    
        def say(self):
            print('hello,我是' + self.__name)
    
    stu = Student()
    stu.say();
    print(stu._Student__name)
    # print(stu.name) 报错:AttributeError: 'Student' object has no attribute 'name'
    

    继承

    声明继承关系:在子类名后跟小括号,小括号里是要继承的父类名

    注意:

    1.在继承父类实例属性时,要先手动调用父类的init函数

    继承关系中的init方法的执行逻辑:在子类没有实现init方法时,会触发父类中的init执行;如果子类实现了init,不会触发父类的init执行

    2.在子类复写父类时,要先手动调用父类相应的方法

    class A:
        def __init__(self):
            self.name = 'zhangsan'
            print('我是父类的init')
        def say(self):
            print('我是父类')
    # 声明继承关系:在子类名后跟小括号,小括号里是要继承的父类名
    class B(A):
        def __init__(self):
            # 手动调用父类的init函数
            A.__init__(self)
            print('我是子类的init')
        def bSay(self):
            print('我是子类')
            
        # 在子类中复写父类
        def say(self):
            A.say(self)
            print('我是复写的新数据')
    
    b = B()
    print(b.name)
    

    相关文章

      网友评论

          本文标题:Python中类、对象和继承相关知识

          本文链接:https://www.haomeiwen.com/subject/czidpxtx.html