May 5th_day14_class&object_oriented

object_oriented&class

编程思想

面向过程编程:一遇到问题就考虑通过代码一步一步的去解决问题
函数时编程:一遇到问题就考虑是否能够有这样功能的一个函数
面向对象编程:一遇到问题就考虑是否有这样一个类,拥有相应的功能和属性

1.什么是类,什么是对象

1.1.什么是类:类是拥有相同功能和相同属性的对象的集合(抽象的)

1.2.什么是对象:对象就是类的实例(具体)

2.类的声明

python所有的数据类型都是类,每种眉形对应的数据都是对象;
int类是所有整数的集合(每个单独的整数都是int的对象)

声明类就是自定义类型。

2.1.语法:

class 类名:
类的内容

2.2.说明

class - 声明类的关键字
类名 - 自己命名,表示符不能是关键字;
见名知义;首字母大写,并且采用驼峰式命名
: - 固定写法
类的内容 - 主要包含:类的说明文档、属性、方法(功能)
补充:什么是方法 - 声明在类中的函数(方法就是函数)

class Person:
    """类的说明文档:人类"""
    def eat(self):
        print('吃东西')
    def run(self):
        print('跑步')

3.创建对象

对象是通过类来创建的

3.1.语法

类() - 创建指定类对应的对象

p1 = Person()
print(p1)

p2 = Person()
print(p2)
"""
<__main__.Person object at 0x101e5b860>
<__main__.Person object at 0x101e5b908>
"""

class

1.类中的方法

类中的方法其实就是声明在类中的函数;类中的方法分为三种:对象方法、类方法、静态方法

2.对象方法

直接声明在类中的函数就是对象方法,有个默认参数self,需要使用'对象.'的方法去调用

p1.eat()
"""
吃东西
"""

注意:对象方法从语法上来说可以使用'类.'的方式去使用,但这样self无意义,不会这样使用

2.1.self

对象方法中的默认参数self,在通过对象调用的时候,这个参数不用传参,系统会自动将当前对象传递给它。
哪个对象调用的当前方法,self就是谁。
self本质就是当前类的对象,所以对象能做的事情self都可以做

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

    def eat(self):
        print('吃东西')
        self.run()

    def run(self):
        print('跑步~')
        print(self)


p1 = Person()
p1.eat()
p1.run()
p2 = Person()
p2.run()
"""
吃东西
跑步~
<__main__.Person object at 0x107650940>
跑步~
<__main__.Person object at 0x107650940>
跑步~
<__main__.Person object at 0x1076509e8>
"""

init方法

1.init方法

python所有的类中都有一个特殊的对象方法:__init__
当通过类去创建对象的时候,系统会自动调用__init__方法,来对对象进行初始化操作。
补充:python中以'__'开头并且以'__'结尾的方法叫魔法方法。所有的魔法都不需要程序员手动调用。系统会在需要的情况下自动调用

2.构造方法

def Dog(*args, **kwargs):
    """伪代码"""
    对象 = 创建对象(在内存中开辟空间创建对象)
    对象.\_\_init\_\_(*args, **kwargs)
    return 对象

函数名和类名一样的方法就是构造方法。

python中,当我们声明类的时候,系统会自动给我们创建这个类的构造方法。
方法中会先在内存中开辟空间创建对象,然后用创建好的对象去调用__init__方法对对象进行初始化。
初始化完成后才将对象返回。

创建对象的时候需不需要参数,需要几个参数,看init方法

"""模仿init方法"""
def __init__(name):
    print('模仿init方法', name)


def Dog1(*args, **kwargs):
    __init__(*args, **kwargs)


Dog1(name='张三')

Property(属性)

类:拥有相同属性和相同功能的对象的集合

1.属性(property)

属性分为:类的字段、对象属性

1.1.类的字段

a.声明:直接声明在类中的变量就是类的字段
b.怎么使用:通过'类.'的方法去使用
c.什么时候用:属性的值不会因为对象的不同而不同,就使用类的字段

1.2.对象属性

a.声明:对象属性需要声明在init方法中,以'self.属性=值'的方式来声明
b.怎么使用:通过'对象.'的方式去使用
c.什么时候用:属性的值会因为对象不同而不同,就使用对象属性

class Person:
    """类的说明文档:人类"""
    def __init__(self, name, age=0):
            # 这的name和age就是Person类的对象属性
        self.name = name
        self.age = age

human1 = Person('张三', 25)
print(human1.name, human1.age, sep='')
"""
张三25
"""

练习:

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

    def eat(self, food):
        print('%s正在吃%s'%(self.name, food))


your_dog = Dog('旺财', '白色', 3)
your_dog.eat('骨头')

his_dog = Dog('狗狗', '黑色', 5)
his_dog.king = '智障'
his_dog.eat('鸡肉')
print(his_dog.king)
"""
旺财正在吃骨头
狗狗正在吃鸡肉
智障
"""

propertyOperation

1.对象属性的增删改查

1.1.查 - 获取对象属性的值

a.对象.属性 - 属性不存在会报错
b.getattr(对象,属性名,默认值) - 获取对象属性的值,属性不存在不会报错,并且返回默认值

class Student:
    def __init__(self, name, age=18):
        self.name = name
        self.age = age
        self.stu_id = (x for x in range(1, 11))


student1 = Student('张三', 20)
student2 = Student('李四')
print(student1.name)
print(getattr(student1, 'name'))
temp_attr = 'age2'
print(getattr(student1, temp_attr, '未找到'))
"""
张三
张三
未找到
"""

1.2.增/改 - 添加/修改属性

a.对象.属性 = 值 - 当属性存在时修改属性的值,当属性不存在时添加属性
b.setattr(对象,属性名,值) - 当属性存在时修改属性的值,当属性不存在时添加属性

student1.name = '王二麻子'
student1.gender = '男'
print(student1.name)
print(student1.gender)

temp_attr = 'name'
setattr(student1, temp_attr, '狗神sb')
print(student1.name)
setattr(student2, 'gender', '女')
print(student2.gender)
"""
王二麻子
男
狗神sb
女
"""

1.3.删 - 删除对象属性

a.del 对象.属性
b.delattr(对象,属性名)

del student1.gender
# print(student1.gender)
delattr(student2, 'gender')
# print(student2.gender)

注意:对象属性的增删改查只针对单个对象

2.__slots__魔法

class Human:

        # 在类中可以通过给__slots__赋值来约束当前类的对象有哪些属性
    __slots__ = ('name', 'age', 'gender')

    def __init__(self, name, age=18):
        self.name = name
        self.age = age


human1 = Human('jaz', 23)
setattr(human1, 'gender', 'man')
print(human1.gender)
setattr(human1, 'hobby', 'basketball')  
# AttributeError: 'Human' object has no attribute 'hobby'

内置类属性

1.内置类属性:声明类的时候系统自动给类添加的属性

1.1.__name__

字段,获取类的类名

class Car:
    """说明文档:车类"""
    num = 100

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.speed = 100

    def stop(self):
        self.speed = 0


print(Car.__name__, type(Car.__name__))
"""
Car <class 'str'>
"""

1.2.__doc__

字段,获取类的说明文档

print(Car.__doc__)
"""
说明文档:车类
"""

1.3.__class__

对象属性,获取对象的类

car1 = Car('audi', 'a4', '2019')
print(car1.__class__)
print(car1.make.__class__)
print([1, 2].__class__)
C1 = car1.__class__
car2 = C1('Benz', 'glc260', '2019')
print(car2.make)
"""
<class '__main__.Car'>
<class 'str'>
<class 'list'>
Benz
"""

1.4.__dict__(重点)

字段,获取当前类所有有的字段和字段对应的值,以字典的形式返回
对象属性,获取当前对象中所有的对象属性和对应的值

print(Car.__dict__)
print(car1.__dict__)
car2.stop()
print(car2.__dict__)
"""
{'__module__': '__main__', '__doc__': '说明文档:车类', 'num': 100, '__init__': <function Car.__init__ at 0x11016e510>, 'stop': <function Car.stop at 0x11016e620>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>}
{'make': 'audi', 'model': 'a4', 'year': '2019', 'speed': 100}
{'make': 'Benz', 'model': 'glc260', 'year': '2019', 'speed': 0}
"""

1.5.__module__

字段,获取当前类所在(声明所在模块)的模块的名字

print(Car.__module__)
"""
__main__
"""

1.6.__bases__

字段,获取当前类的父类

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

推荐阅读更多精彩内容