Python学习总结【连载】(十二)

Python学习总结【连载】(十一,十二)

2018.06.27 Juttachen


概述

+ 37 类的定义

+ 38 对象属性和init方法

+ 39 self

+ 40 属性的增删改查

+ 41 内置类属性


三十七、类的定义

复习
类:具有形同属性和功能的对象的集合;是抽象的
对象:类的实例;具体的

1.类的声明

格式:

class 类名(父类):
属性
方法

class 类名:
属性
方法

a.class:python中声明类的关键字
b.类名:标识符。特殊规范:首字母大写,见名知意。
c.属性:分类的字段和对象的字段 ----------->属性
d.方法:分对象方法(构造方法),类方法,静态函数 ---------->功能

1)方法:就是声明在类中的函数(都有一个默认参数,不需要调用的时候给他传值)
2)对象方法:在类中直接声明的函数,带一个参数self,要使用对象来调用

    # 声明类
    class Person:
        """人类""" # 类的说明文档

        # 在类中声明了eat方法,默认有一个参数self,调用eat防范的时候,不需要给delf传参
        # 在类中直接声明的函数都是对象方法,对象方法必须使用对象来调用

        def eat(self):
            print('吃饭')

        # 直接写在类中的函数,必须带参数self
        # def run()
        #   print('aaa')

    # 注意:如果要在类中声明带参才能的对象方法,那么其他的参数必须写在self的后面
        def run(self,num):
            print('跑了%s米'%(num))

2. 创建对象

通过类名就可以创建对象,然后可以用变量存起来
可以通过对象去调用类中的对象方法,和使用类中声明的对象属性(字段)

    p1 = Person()
    # p1就是Person类的一个实例(对象)

调用对象方法,对象.方法()
写在类里面的函数也可以传参

    p1.eat()
    p1.run(100)

一个类可以创建多个对象

    p2 = Person()
    p2.eat(80)

三十八、对象属性和init方法

实例一:init方法会自动被调用。
_ init _方法又叫构造方法。是在通过类创建对象的时候,自动调用的方法。
_ init _方法的作用就是在创建对象的时候初始化对象的属性。
_ init _:对象的属相就是声明在整个方法中

    class Person:
        def __init__(self):
            # 在这个地方声明对象的属性。。。
            print('这个是init')

在声明对象的时候会自动调用init方法

    p1 = Person()
    p2 = Person()

实例二:带参的init方法
init的方法的方法名固定:init。但是参数是可以随意改变的(但是self参数不变)

    class Dog:
        def __init__(self,name):
            print('名字是:%s'%(name))

通过类创建对象的时候,要保证init方法里面的每一个参数都有值。通过类后面的括号里传参来保证每个参数都有值。

    dog1 = Dog('蔡蔡')

实例三:对象属性
属性:声明在类中的变量
对象属性:要通过对象去使用;不同的对象可能会有不同的值:

    class Person2:
        """人类"""
        # 在init方法中声明对象的属性:self.属性名 = 初值
        def __init__(self):
            # 声明一个对象属性name:初始值为空串
            self.name = ''
            # 声明一个对象属性age:初始值为10

    # 通过Person2类创建对象1
    p1 = Person2
    # 通过对象去修改P1的name属性
    p2 = Person2
    # p1.name = 'print(p2.name)

练习:声明一个学生类,拥有属性:名字,年龄,电话。拥有方法:学习

    class Student:
        def __init__(self):
            self.name = ''
            self.age = 18
            self.tel = 12345678910

        def study(self):
            print('学习')

    stu = Student()
    stu.name = '韩梅梅'
    print(stu.name,stu.age,stu.tel)
    # 调用对象方法(给对象发送消息)
    stu.study()

实例四:创建对象的时候赋初值

    class Student2:
        def __init__(self,name1='',age1=1,tel1=''):
            self.name = name1
            self.age = age1
            self.tel = tel1

    # 在创建对象的时候给对象属性赋初值
    stu2 = Student2('小明', 18,'112')
    print(stu2.name)
    stu3 = Student2(name1="小王")

三十九、self

类中的对象方法都有一个默认参数self:
1.调用带有默认参数self的方法,不需要给self传参。系统会自动将调用当前方法的对象传给self
2.在方法中使用self就相当于使用调用方法的对象(只能使用self,不能重新给self赋值)

    class Person:
        """人"""

        def __init__(self, name='', age=''):
            """声明对象的属性"""
            self.name = name
            self.age = age

        def eat(self):
            print('%s eat breakfirst.' % (self.name))

        # 声明一个对象的方法run
        def run(self):
            print('self', self)
            print('run now!!')

            # 在对象方法中使用对象的属性,直接用self去获取属性
            print('%s run now' % (self.name))
            self.eat()


    # 创建一个Person对象
    p1 = Person('小明', 10)

    # 通过对象p1去调用run方法,系统会将self = p1
    # 这个时候在run方法中,p1和self是同一个东西
    p1.run()
    print('p1', p1)
    # eat中的self = p1
    p1.eat()

    p2 = Person('小红', 20)
    p2.run()
    p2.eat()

练习:声明一个圆类,拥有属性:半径 拥有方法:计算圆的面积,计算圆的周长

    import math
    # 或者 from math import pi(之后就不需要写math.pi,而是直接写pi)

    class Circle:
        def __init__(self, radius=10):
            self.r = radius

        # 在对象方法中可以通过self去使用对象
        def area(self):
            C = math.pi * self.r ** 2

        # 注意要 return C 或者直接 return math.pi * self.r ** 2

        def perimeter(self):
            l = 2 * math.pi * self.r
            return l
        # 同上道理
    c1 = Circle()
    print('%.2f' % c1.area())
    print('%.2' % c1.perimeter())

    c2 = Circle(3)
    print(c2.area())

四十、属性的增删改查

    class Dog:
        """狗狗"""
      def __init__(self,name = '',age = 0):
    self.name = name
    self.age = age
    dog1 = Dog('才才')

1.查

方法一:对象.属性
特点:如果属性村子就获取属性的值。如果属性不存在就会报错。

    print(dog1.name)
    # print(dog1.score) # AttributeError: 'Dog' object has no attribute 'score'

方法二:getattr(对象,属性名,默认值) --> 获取指定对象的指定属性
如果不设置默认值:属性如果存在就获取属性的值,不存在就会报错
如果设置默认值:属性如果存在就获取属性的值,不存在不仅不报错,而且将默认值作为结果(但是不创建属性)

  """
        getattr(object, name[, default]) -> value

        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
  """

    print(getattr(dog1,'name'))
    print(getattr(dog1,'score',100))
    # print(getattr(dog1,'color')) # AttributeError: 'Dog' object has no attribute 'color'
    # print(getattr(dog1,'score')) # AttributeError: 'Dog' object has no attribute 'score'

方法三:对象.getattribute(属性名)
获取指定对象的指定属性。如果属性不存在就会报错。

    print(dog1.__getattribute__("name"))
    # print(dog1.__getattribute__("sex")) # 和方法一一样报错

2.改(修改)

方法一:对象.属性 = 新值

    dog1.name = '大黄'
    print(dog1.name)

方式二:setattr(对象,属性名,新值)

    setattr(dog1,'name','小黄')
    print(dog1.name)

方式三:对象.setattr()

    dog1.__setattr__('name','小黑')

3.增(添加属性)

python中可以动态的给对象添加属性
方法一:
用对象.属性 = 新值就可以增加(只要对象不存在)

    dog1.sex = '男'
    print(dog1.sex)

方式二:setattr(对象,不存在的属性名,新值)

    setattr(dog1,'color','brown')
    print(dog1.color)

方式三:对象.setattr()

    dog1.__setattr__('score','100')
    print(dog1.score)

4.删除属性

方法一:del 对象.属性
将dog1的age属性删除

  del dog1.age
  # print(dog1.age)  # AttributeError: 'Dog' object has no attribute 'age'

方法二:delattr(对象,属性名)

    delattr(dog1,'age')
    # print(dog.age)  # AttributeError: 'Dog' object has no attribute 'age'

方法三:对象.delattr(属性名)

    dog1.__delattr__('age')
    # print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'

5.判断对象是否拥有某个属性

方式:hasattr(对象,'属性名') ----> 判断指定的对象是否拥有指定的属性

    result = hasattr(dog1,'name')
    print(result)

补充:
实例1:对象属性的操作只对当前那一个对象有效

    class Person:
        def __init__(self,name = '',age = 0,id_num = '',sex = ''):
            """人"""
            self.name = name
            self.age = age
            self.id_num = id_num
            self.sex = sex

    p1 = Person('小明',10)

    # 给不存在的属性赋值,就是添加属性
    p1.score = 100
    print(p1.score+100)

    p2 = Person('罗昊',30)
    # print(p2.score) #AttributeError: 'Person' object has no attribute 'score'

注意:1.对对象属性的增,删,改,查是指定那一个对象。不会影响其他的对象。
2.实际开发的时候,一般只用获取对象属性的值和修改对象属性的值。想添加或删除属性,一般都是在init方法中操作

实例二:

    class Dog:
        """狗"""
        #  通过给__slots__赋值,可以限制类中对象的属性有哪些,防止一个不必要的属性被添加
        __slots__ = ('name','age','color')
        def __init__(self,name='',age=0,color=''):
            self.name = name
            self.age = age
            self.color = color
            # self.sex = '男' # 在__slots__ 中没有sex的话,不管在哪都不能添加,只能先在__slots__ 中添上才能添加

    dog1 = Dog('笑话',3,'Yellow')
    dog1.name1 = '大黄'

    del dog1.name
    # 注意__slots__ 中规定的属性只能少不能多。删除属性是不受影响的。

四十一、内置类属性

    class Dog:
        """狗"""
        def __init__(self,name='',age=0,color=''):
            self.name = name
            self.age = age
            self.color = color

        def run(self):
            print('%s跑起来'%(self.name))

        def shout(self):
            print('%s在叫唤'%(self.name))
    
    dog = Dog()

内置的类属性是属于类的,需要通过类去使用

1. 类.name :获取类的名字

    class_name = Dog.__name__ # 'Dog'
    print(class_name,type(class_name))
    # 这个属性只有类有

2.类.doc:获取类的说明文档

    print(Dog.__doc__)

3.类.dict(对象.dict):获取类中所有的类属性(类字段)

    print(Dog.__dict__)
    print(dog.__dict__) #获取了所有关于dog的属性和值(以字典键值对的方式)【包括添加的】

4.类.module:获取类所在的模块的名字

    print(Dog.__module__)

5.类.bases :获取指定类的基类

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

推荐阅读更多精彩内容