Learn Python with Steem #07 笔记


划重点

  • 类与对象

    把一些具有共同特征的对象的属性和行为(方法)抽取出来,将其抽象化,定义为类。
    也就是说类是对象的模板,按照模板(类)实例化(具体化),这就是对象。
    类是抽象的概念,而对象是具体的东西。

  • 类的属性与方法

    类的属性和方法都是一群对象的共同特征。
    属性是那些对象的静态特征,在类中定义的变量。
    方法是那些对象的动态特征(行为),在类中定义的函数。
    这么说也不太准确,有些类中的有些方法和属性是关于类的,而与对象无关系。
    通过定义类,实现了对数据和对数据的操作的封装

编程练习

# 作业
class Person(object):
    def __init__(self, _name, _height, _weight, _gender):
        self.name = _name
        self.height = _height
        self.weight = _weight
        self.gender = _gender
        self.count_update = 0

    def get_bmi(self):
        bmi = sel.weight / (self.height**2)
        return bmi

    def rename(self, _name):
        if self.name == _name:
            pass
        else:
            self.name = _name
            self.count_update += 1


me = Person('zzzABC', 1.75, 65, 'Male')
print(me.name)
me.rename('zzzABC')
me.rename('kkkABC')
print('========= After Update ===========')
print(me.name)
print(me.count_update)
zzzABC
========= After Update ===========
kkkABC
1

补充

对象属性和类属性

class People(object):
    # 定义类属性count_people,与所有对象共享
    count_people = 0

    # 创建对象时的初始化操作
    def __init__(self, _name):
        # 定义对象属性name
        self.name = _name
        People.count_people += 1

    # 删除对象时的操作
    def __del__(self):
        People.count_people -= 1


me = People('Yjcps')
print(me.name)
print(me.count_people)
print()

friend = People('Tom')
print(friend.name)
print(friend.count_people)
print(me.count_people)
print()

del friend
print(me.count_people)
print()

del me
print(People.count_people)

Yjcps
1

Tom
2
2

1

0

静态方法和类方法

class Triangle(object):
    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    # 静态方法,通过装饰器@staticmethod定义,静态方法属于类方法
    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b

    # 类方法使用装器@classmethod定义,cls 表示类本身
    @classmethod
    def create_by_default(cls):
        a = 3
        b = 4
        c = 5
        return cls(a, b, c)

    # 对象的方法,self表示对象本身
    def perimeter(self):
        return self._a + self._b + self._c


# 检查是否可以构成三角形
if Triangle.is_valid(1, 2, 3):
    t1 = Triangle(1, 2, 3)
else:
    print("Can't creat a Triangle")

# 通过类方法创建默认的三角形
t2 = Triangle.create_by_default()

# 通过对象的方法计算三角形的周长
print('perimeter:', t2.perimeter())
Can't creat a Triangle
perimeter: 12

抽象方法

import abc


class Shape(object):
    def __init__(self, _name):
        self.name = _name

    # 定义没有(可能无法)实现的方法,需要在子类中改写此方法
    @abc.abstractmethod
    def perimeter(self):
        '''Method should be rewrited'''


t1 = Shape('Shape')
t1.perimeter()

继承

import abc


# 定义父类(基类)
class Shape(object):
    def __init__(self, _name):
        self.name = _name

    # 定义没有(可能无法)实现的方法,需要在子类中改写此方法
    @abc.abstractmethod
    def perimeter(self):
        '''Method should be rewrited'''


# 定义子类 继承Shape类
class Triangle(Shape):
    def __init__(self, a, b, c):
        # 调用父类的初始化方法
        Shape.__init__(self, 'Triangle')

        self._a = a
        self._b = b
        self._c = c

    # 在子类中改写perimeter方法
    def perimeter(self):
        return self._a + self._b + self._c


t1 = Triangle(3, 4, 5)
print(t1.name)
print(t1.perimeter())
Triangle
12

多态

class Square(Shape):
    def __init__(self, a):
        # 调用父类的初始化方法
        Shape.__init__(self, 'Square')
        self._a = a

    # 在子类中改写perimeter方法

    def perimeter(self):
        return self._a**2


t1 = Triangle(3, 4, 5)
s1 = Square(5)

# 不同的类可以有相同名字的方法,它们的行为可以不同,这就是多态。
print(t1.perimeter())
print(s1.perimeter())
12
25

[DA series – Learn Python with Steem]

我的笔记: