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 
"""

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)
"""



Benz
"""

1.4.__dict__(重点)

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

print(Car.__dict__)
print(car1.__dict__)
car2.stop()
print(car2.__dict__)
"""
{'__module__': '__main__', '__doc__': '说明文档:车类', 'num': 100, '__init__': , 'stop': , '__dict__': , '__weakref__': }
{'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__)
"""
(,)
"""

你可能感兴趣的:(May 5th_day14_class&object_oriented)