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

2017-10-27  本文已影响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)
上一篇下一篇

猜你喜欢

热点阅读