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

定义类并创建对象

在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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容