01-11 day15 class object

2019-01-11  本文已影响0人  ychaochaochao

1.编程思想

1.面向过程编程 - 遇到问题直接将逻辑转换成代码; 逻辑思维,算法
2.函数式编程 - 遇到问题就想找一个、写一个拥有相应功能的函数; 以函数作用工具
3.面向对象编程 - 遇到问题就考虑可以不可以有一个类来给我提供相应的功能和数据; 以类和对象为工具

面向过程编程

import json
# json.load()

import datetime

print(datetime.datetime.today())


num1 = 34
num2 = 34
print(num1 + num2)

函数式编程:

def sum1(num1, num2):
    return num1+num2


print(sum1(1, 23))
print(sum1(23, 45))

def sum2(n):
    sum1 = 0
    for x in range(n+1):
        sum1 += x
    return sum1

print(sum2(100))
print(sum2(50))

sum1 = 0
for x in range(51):
    sum1 += x
print(sum1)


2.认识类和对象

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

类就是拥有相同功能和相同属性的对象的集合; 类是抽象的
对象就是类的实例; 对象是具体的

人是类, 某个人就是人类的对象
车是类, 楼下停在...的那辆车就是对象
电脑是类, 我桌上这台黑色的电脑就是对象

2.类的声明

类中的内容包含功能(函数)和属性(变量/属性)

3.对象的声明

声明一个人类

class Person:
    """类的说明文档: 人类"""
    num = 61    # 类中的属性

    # 类中的方法
    def eat(self):
        print('人在吃饭')
def main():
    # 创建Person类的对象;p1就是对象
    p1 = Person()
    print(p1)

    # 同一个类可以创建多个对象
    p2 = Person()
    print(p2)

    p3 = p2
    print(p3)


if __name__ == '__main__':
    main()


3. __init __方法和构造方法

1.init方法: __init __

__init __方法是类中的一个特殊的对象方法,专门用来对象创建的对象进行初始化。
当通过类创建对象的时候,系统就会自动调用init方法

2.构造方法

def Person(*args, **kwargs):
   对象 = 创建对象
   对象.__init__(*args, **kwargs)
   return 对象

注意: 如果类的__init __方法除了self以外还有其他参数,那么我们在创建对象的时候需要通过给构造方法来给__init __方法传参

class Person:
    # 类中__ 开头并且__结尾的方法叫魔法方法。不需要主动调用,系统会自动调用
    def __init__(self):
        print('init被调用了')

class Dog:
    def __init__(self, x=0, y=9):
        print(x, y)
        print('dog的init')
# =============构造方法和init的关系(了解)=============
# 构造方法的伪代码
def my_init(x, y, z=0):
    print(x, y, z)
    print('my_init')


def my_Dog(*args, **kwargs):
    my_init(*args, **kwargs)


my_Dog(10, 20, 34)
my_Dog(10, 34)
# ===================================================

def main():
    # 人类
    print('====')
    p1 = Person()
    print('====')

    p2 = Person()

    # 狗类
    dog1 = Dog(10, 20)
    dog2 = Dog()
    dog3 = Dog(100)
    dog4 = Dog(y=200)


if __name__ == '__main__':
    main()


4.对象属性

1.什么是对象属性

类中的属性分为类的字段和对象属性

class Person:
    # num就是类的字段
    num = 61

    # 在init方法中声明对象属性
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age

练习:创建Dog类,有属性名字、类型、年龄
要求创建Dog的对象的时候:不能给年龄赋值,可以给类型赋值也可以不用给类型赋值,必须给名字赋值
对象方法eat:打印XXX在吃什么

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

    def eat(self, food):
        # self = dog1, food = '骨头'
        # self = dog2, food = '屎'
        print('%s在吃%s' % (self.name, food))

练习: 声明矩形类,拥有属性长和宽,拥有方法求面积和求周长

class Rect:
    def __init__(self, length: float, width: float):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return (self.length + self.width) * 2
def main():
    # 使用类的字段
    Person.num = 100
    print(Person.num)

    r1 = Rect(100, 98)
    print(r1.area())
    print(r1.perimeter())

    p1 = Person('小明', 18)
    # 获取对象属性的值
    print(p1.name, p1.age)

    p2 = Person('小红', 20)
    # 修改对象属性的值
    p2.name = '李四'
    print(p2.name, p2.age)

    dog1 = Dog('大黄')
    dog1.eat('骨头')

    dog2 = Dog('旺财', '中华田园犬')
    print(dog2.name, dog2.age, dog2.type)
    dog2.eat('屎')

if __name__ == '__main__':
    main()


5.对象属性的增、删、改、查

python中对象的属性支持增删改查

属性的增删改查

class Person:
    def __init__(self, name='', age=0, sex='女'):
        self.name = name
        self.age = age
        self.sex = sex
class Dog:
    # __slots__魔法
    # 约束当前类的对象最多能拥有那个属性
    __slots__ = ('name', 'color', 'age', 'sex')

    def __init__(self, name='', color='黑色'):
        self.name = name
        self.color = color
        self.age = 10


def main():
    dog1 = Dog('大黄', '黄色')
    # dog1.age = 2
    dog1.name = 'ss'

    del dog1.color
    dog1.sex = '母'
    print(dog1.sex)

    dog2 = Dog()
    # print(dog2.sex)  # AttributeError: sex
    print('==============属性的增删改查===============')
    p1 = Person('小花')
    p2 = Person('小红')

1.查(获取对象属性)

    print('==============查===================')
    print(p1.name)
    # print(p1.name1)   # AttributeError:'Person' object has no attribute 'name1'

    # 属性不确定的时候可以使用getattr
    # attr = input('属性:')
    # print(getattr(p1, attr))

    print(getattr(p1, 'name', None))
    print(getattr(p1, 'name1', None))

增/改

    print('==============增/改===================')
    # 修改属性
    p1.name = 'xiaohua'
    print(p1.name)
    # 添加属性
    p1.height = 180
    print(p1.height)

    # 修改属性
    setattr(p1, 'age', 18)
    print(p1.age)
    # 添加属性
    setattr(p1, 'weight', 200)
    print(p1.weight)

    print('==============删=================')
    del p1.sex
    # print(p1.sex)  # AttributeError: 'Person' object has no attribute 'sex'

    delattr(p1, 'age')
    # print(p1.age)  # AttributeError: 'Person' object has no attribute 'age'

注意:对象属性的操作,只针对操作的那一个对象,不会影响其他对象

    print(p1.height)
    # print(p2.height)  # AttributeError: 'Person' object has no attribute 'height'
    print(p2.age)


if __name__ == '__main__':
     main()


6.内置函数

内置属性指的是我们创建类的时候系统自动给我们添加的属性(其实是通过继承获取到的)

class Person:
    """说明文档:人类"""
    # 类的字段
    num = 61

    # __slots__ = ('name', 'age', 'sex')

    # 对象属性
    def __init__(self, name='', age=0, sex='男'):
        self.name = name
        self.age = age
        self.sex = sex

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

定制对象的打印格式(当我们通过print打印一个对象的时候,实质就是打印对象调用repr函数的返回值)
这个函数的返回值必须是字符串

    def __repr__(self):
        # return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
        return '<' + str(self.__dict__)[1:-1] + ' at ' + hex(id(self)) + '>'


def main():
    """"""
    p1 = Person('小明', 18)
    print(p1)    # print(p1.__repr__())

    persons = [Person('p1', 12), Person('p2', 18, '女')]
    print(persons)
    print(Person)
    class_name = Person.__name__
    print(Person, class_name)
    # 值是一个字符串,可以当成字符串来用
    print(class_name.upper())
    # 获取对象p1的类
    my_class = p1.__class__
    print(my_class)
    # 可以将my_class当成类来使用
    p2 = my_class('小花')
    print(my_class.num)
   print(Person.__doc__)
    print(int.__doc__)
   # 获取对象p1对应的类的说明文档
    print(p1.__class__.__doc__)
    print(p1.__dict__)
    print(Person.__module__)
    print(Person.__bases__)

if __name__ == '__main__':
    main()


7.类方法和对象方法

1.对象方法:

a.怎么声明: 直接声明在类里
b.特点: 自带self参数,调用的时候不用传参,谁调用指向谁
c.怎么调用: 对象.方法()

2.类方法:

a.怎么声明: 声明函数前加@classmethod
b.特点: 自带默认参数cls; 调用的不用传参,系统会自动将调用当前函数的类传给它
(cls是谁调用就指向谁, 类方法只能通过类来调用,所以cls就是当前类)
类能做的事情,cls都能做

c.怎么调用: 通过类来调用, 类.方法()

3.静态方法

a.怎么声明:声明函数前加@staticmethod
b.特点: 没有默认参数
c.怎么调用:通过类来调用, 类.方法()

4.在类中怎么选择使用哪种方法:

如果实现类中的函数的功能需要使用对象的属性, 那么这个函数就要声明对象方法。
实现函数的功能不需要对象属性的前提下,如果需要类的字段, 就声明成类方法
实现函数的功能既不需要对象属性也不需要类的字段就声明成静态方法

class Person:
    num = 61

    def __init__(self):
        self.name = '张三'
def func4(self):
    print('%s对应的对象' % self.name)
    # print('人类的数量:%d亿' % Person.num)
@staticmethod
def func3():
    print(Person.num)
    print('我是静态方法!')
@classmethod
def func2(cls):
    print(cls.num)
    print('我是类方法2')

@classmethod
def func1(cls):
    # 类能做的,cls都能做
    p1 = cls()    # 用cls来创建对象
    print(p1)

    cls.num = 100  # 用cls来使用类的字段

    cls.func2()   # 用cls调用类方法

    print('cls:', cls)
    print('这是一个类方法')
def main():
    print(Person)
    Person.func1()
    Person.func3()
    p1 = Person()
    p1.func4()


if __name__ == '__main__':
    main()
上一篇下一篇

猜你喜欢

热点阅读