Python基础 类

Posted by Zhenda on Thu, Nov 23, 2023
Total Views:

一:概念阐述

面向对象

因为提高了代码的复用性,开发效率高,而且便于扩展迭代,所以成为了主流的开发思想。其中的核心概念就是类,在面向对象的思想中,可以用类来抽象一切的事物

抽象一类事物为一个模型。用 属性方法 来描述。

属性

描述一类事物的属性,本质上是类中的变量。包括两种:

实例属性:这个类的对象的一种 个体的属性

类属性:这个类所有对象的一种 整体的属性

方法

描述一类事物的行为,本质上是类中的函数。包括三种:

实例方法:

self: 实例方法中,自动添加的一个参数,代表调用此方法的对象。

类方法:

cls: 实例方法中,自动添加的一个参数,代表调用此方法的类。用@classmethod装饰

静态方法:

既不使用self,也不使用cls的方法。用@staticmethod装饰

调用方法的两种方式

  1. 对象调用方法

  2. 类名调用方法

对象

是具体的一个一个的事物,由 制造而成。

实例化

类制造对象的过程

1
2
3
4
5
class Person(object):  # 创建类
    pass

if __name__ == '__main__':
    p1 = Person()  # 类加括号:实例化一个对象

二:python中的顶级父类及其属性和方法

object:顶级父类,继承的源头,默认继承它

_class_: 查看实例化这个对象的类

_bases_:查看父类

_dict_: 字典形式__显示属性__

dir(obj):查看obj拥有的方法

_new_(): 创建对象

_init_():初始化对象的属性,创建对象自动调用,可以设置默认参数

_str_():打印对象信息,必须return字符串,print(对象)的时候

_repr_():打印对象信息,必须return字符串,print(对象容器)的时候,例如[obj1, obj2,…]

type:顶级元类,实例化的源头,一般了解即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person(object):  # 创建类
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(self.name, '吃饭')

    def __str__(self):
        return self.name


if __name__ == '__main__':
    p1 = Person('lisi')  # 类加括号:实例化一个对象
    print('----------------------查看属性和方法-----------------------')
    print(p1.__dict__)  # 以字典形式打印对象属性
    print(dir(Person))  # 打印类的方法

    print('-----------------__class__-----__bases__----------------')
    print(p1.__class__)  # 实例化此对象的类
    print(Person.__bases__)  # 此类的父类们

    print('----------了解---------object-------type-----------------')
    print(object.__class__)  # 实例化object这个对象的是 type这个顶级元类
    print(object.__bases__)  # object没有父类
    print(type.__class__)  # 实例化type这个对象的类是它自己
    print(type.__bases__)  # type的父类是object这个顶级父类

运行结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
----------------------查看属性和方法-----------------------
{'name': 'lisi'}
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'eat']
-----------------__class__-----__bases__------------------
<class '__main__.Person'>
(<class 'object'>,)
----------了解---------object-------type----------------------
<class 'type'>
()
<class 'type'>
(<class 'object'>,)

三:封装

python中,封装属性,方法的办法是:

在属性和方法前面加 两个下滑线,例如:‘__属性’,‘__方法’

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # __ 防止在类的外部使用

    def show(self):
        print(self.name, self.__age)

    def __show2(self):
        print('测试封装方法')


stu = Student('张三', 23)
stu.show()
# stu.__show2()  #AttributeError: 'Student' object has no attribute '__show2'
print(stu.name)
# print(stu.__age)  # AttributeError: 'Student' object has no attribute '__age'
print('-----------------------------------------------')

运行结果:

1
2
3
张三 23
张三
-----------------------------------------

封装属性,是为了类来控制 属性的读写

使用装饰器 @property和@属性名.setter,可以很好控制属性的访问

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Student:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, new_name):
        self.__name = new_name

    @property
    def age(self):
        return self.__age
    # 注释掉,就不能外部修改了
    # @age.setter
    # def age(self, new_age):
    #     self.__age = new_age

if __name__ == '__main__':
    s1 = Student('qq', 12)
    print(s1.name)
    s1.name = 'hahaha'
    print(s1.name)

    print(s1.age)
    s1.age = 20
    print(s1.age)

运行结果:

1
2
3
4
AttributeError: can't set attribute
qq
hahaha
12