8、Python类

类的命名规范:

  1. 类名的首字母大写
  2. 不建议使用_来连接多单词的类名
#标准类的书写方式
class Student():
    name = ''
    age = 18
    def out(self):  #方法必须添加self参数
        print(self.name + str(self.age))  #使用自身的参数

#类的实例化
student = Student()
#调用类下面的方法
student.out()

错误(当变量名调用出错):self.name 写成 name



类的易错点:
 1. 类内不能运行类内的方法

类的设计:数据成员|变量(特征) + 方法|函数(行为),类是模板,并不是一个实体。
方法和函数的区别:
 方法:设计层面的称谓
 函数:程序运行,过程式的一种称谓

#设置构造函数(类似于包的初始化模块)
def __init__():
    pass
    return None  #构造函数只能返回None(类型为Nonetype,属于一种特殊的数据类型)

#设置类的输入值(必须输入)
def __init__(self,name,age):  #此处的self可被任意命名,但是后面的如self.name等都要换成相应的名称。
    self.name = name  #将类变量赋值到实例变量上
    self.age =  age

类变量:和模板绑定在一起的变量
实例变量: 和对象绑定在一起的变量

class Student():
    # name = ''  #此处不用设置变量,在python中不需要事先声明变量,变量只是名称而已。
    # age = 18

    def __init__(self,name,age):
        self.name = name
        self.age =  age
        
    def out(self):
        print(self.name + str(self.age))

实例和类其实是两个客体,实例只关心self.name,而类中是否命名了name并不重要。只要赋值了self.name,实例的name就存在了,并不关心类中是否有name这个变量。

class Student():
    name = 'qiyue'
    age = 18

    def __init__(self,name,age):
        name = name  #如果此处变为name = name
        age =  age
        
    def out(self):
        print(self.name + str(self.age))

student = Student('xzh','18')
student.out()
print(student.name)

查看对象下的所有变量(以字典的形式)

print(student.__dict__)  #产看对象下的全部变量
# 当输出.name时,如果在对象下没有赋值,则系统会在类变量(类,父类)中寻找,如果类变量中也没有就会报错。
print(student.name)

#实例方法
def out(self):  #必须添加self
    print(self.name + str(self.age))

self本质上就是实例,例如:self.name 本质上就是 student1.name(self只是一个抽象概念指代具体的实体)

类的思维导图

构造函数是用来做初始化的,而实例函数用来规定类的行为。

class Student():
    name = 'qiyue'
    age = 18

    def __init__(self,name1,age):
        self.name = name1
        self.age =  age
        print(name)
#此时会报错,因为在类内,编译器不会调用__dict__函数查找name。只会在类外时才会调用。

#实例方法中访问类变量
使用:类名.变量名(Student.name)
使用:self.__class__.name (获取实例的类的姓名)

类方法:用于类上的基本操作

@classmethod    #装饰器
     def plus_num(cls):  #此时的cls是类相当于(self.__class__)
         cls.name = ' '  #类中的变量name

调用类方法尽量使用类进行调用,如:Student.plus_num()

静态方法:和类方法类似,只是没有显示的把类传递进来

@staticmethod
    def add(x,y):
        pass

成员可见性:

某些时候,我们不希望所有的变量和方法都可以在类外被调用,只能在类内进行调用。

#类中的方法可以调用其他的方法
def out(self):
        print(self.name + str(self.age))
        self.output()
    
    def out_name(self):
        print(self.name)

有时,数据成员不都在init方法中设置,也需要在其他方法中添加,来完善我们类设计时的逻辑性。
在方法中修改数据成员的值时可以添加逻辑(如score只能在0,100之内)
成员可见性等级:
  如果变量不是以双下划线命名的,等级统统都是public(可直接在类外访问)
  以双下划线命名的,等级为private(不能在类外直接访问变量)
  前后都添加双下划线,也可以从外部访问(大部分都时python的内置函数,最好不要这样设置)

class Student():
    def __init__(self,name):
        self.name = name
        self.__score = 0    #设置私有变量score

#此时以下输入并没有报错
student = Student('xzh','18')
student.__score = 1  #这里其实是给实例新增加变量__score,私有的score变量根本不会在外部搜到
print(student.__score)

#第三个为私有变量,第四个为新赋值的变量(python中其实已经把私有变量的名字修改了,如果还想调用其实也是可以的,只不过要输入正确的变量名)
{'name': 'xzh', '_Student__score': 0, '__score': 1}

面向对象三大特性:继承性,封装性,多态性

继承性:避免定义重复的方法和变量

python允许多继承(一个子类可以有多个父类)

#继承的基本结构(继承父类的方法和变量)
class Pepole():
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def out_name(self):
        print(self.name)

class Student(Pepole):
    pass

student = Student('张三','18')
student.out_name()

输出:张三
#显式调用父类的__init__函数
class Student(Pepole):
    def __init__(self, school,name,age):
        Pepole.__init__(self,name,age)
        self.school = school

#隐式的调用父类
class Student(Pepole):
    def __init__(self, school,name,age):
        super(Student,self).__init__(name,age)
        self.school = school

#如果子类方法和父类方法同名,python会自动使用子类的方法

为什么方法中都必须要有一个self?:方法本质上是行为,如果没有实例化,根本谈不上行为,行为是动态的,如果没有具体化根本没有具体的行为的一说。所以要使用方法,前提就是实例化。

以下的行为也是成立的

Student.out_name(student)  #深入理解类和实体

开闭原则:代码对自己的扩展是开放的,对更改自身的代码是关闭的。

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

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,752评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,802评论 1 10
  • 樱水晶,皮实得很,刚来的时候是一头,三年多,几个小崽冒出来盆都不够长了,剪下一头尝试水培,非但马上出根,长势还很喜...
    随想365阅读 177评论 0 0
  • 午后的暑气渐渐退去,晚风习习。像往常一样,晚饭过罢。 左臂下夹着一本书匆匆向阅览室方向走去。...
    soumns张三的歌阅读 117评论 1 1