龙空技术网

python全栈核心提炼-第一章:python基础-类

毫无波澜的流浪 598

前言:

当前小伙伴们对“python的元类”大约比较关注,同学们都想要了解一些“python的元类”的相关资讯。那么小编同时在网摘上汇集了一些对于“python的元类””的相关内容,希望咱们能喜欢,姐妹们快快来了解一下吧!

一:概念阐述面向对象

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

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

属性

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

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

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

方法

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

实例方法:

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

类方法:

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

静态方法:

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

调用方法的两种方式

对象调用方法类名调用方法对象

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

实例化

类制造对象的过程

class Person(object):  # 创建类    passif __name__ == '__main__':    p1 = Person()  # 类加括号:实例化一个对象
二:python中的顶级父类及其属性和方法

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

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

__bases__:查看父类

__mro__:查看所有父类

__subclasses__():查看所有子类

__dict__: 字典形式显示属性

dir(类名):查看类的方法

__new__(): 创建对象

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

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

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

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

class Person(object):  # 创建类    def __init__(self, name):        self.name = name    def eat(self):        print(self.name, '吃饭')    def __str__(self):        return self.nameif __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这个顶级父类

运行结果

----------------------查看属性和方法-----------------------{'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中,封装属性,方法的办法是:

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

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('-----------------------------------------------')

运行结果:

张三 23张三-----------------------------------------

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

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

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_ageif __name__ == '__main__':    s1 = Student('qq', 12)    print(s1.name)    s1.name = 'hahaha'    print(s1.name)    print(s1.age)    s1.age = 20    print(s1.age)

运行结果:

AttributeError: can't set attributeqqhahaha12

标签: #python的元类