Python类(创建对象的蓝图) -*- Python基础知识10 -*-

类的简介

类是一个创建对象的图纸,同时类本身也是一个对象,简单的说类就是一个创建对象的对象(类本身是一个type类型的对象)

class Prople:
    pass
print(type(Prople)) # <class 'type'>

类的创建、使用方法

创建方法

用class关键字来定义,根据约定类名首字母大写
语法

 class 类名([父类]):
            公共属性
            
            对象的初始方法
            def __init__(self):
                ...            
            def 方法1 (self):
                ...
            def 方法2 (self):
                ...

使用方法

被类赋值的变量称之为类的实例
类中的变量称之为属性
类中的函数称之为方法
在类的中我们可以定义属性和方法,在类中定义的内容会变成所有实例的公共内容。
通过(实例.属性名 = 属性值)可以改变此实例属性
通过(实例.方法名)来调用
通过isinstance(变量,类名)来验证变量是否在此类中。

class Prople:
    name = '寻觅'
    def eat(self):
        print('%s很能吃' %self.name)

a = Prople()
b = Prople()
# 通过(实例.属性名 = 属性值)可以改变此实例属性
a.name = '绿巨人'
# 通过(实例.方法名)来调用
a.eat() # 绿巨人很能吃
b.eat() # 寻觅很能吃
# 通过isinstance(变量,类名)来验证变量是否在此类中。
print(isinstance(a, Prople)) # True

self的含义

在函数中,形参和实参数量相同,但是在方法中形参永远比实参多一个,如果创建的方面中没有形参则会报错。多出的形参为解释器自动传递,传递的值为调用方法的本身,一般我们会将这个函数命名为self。

class Prople:
    def eat(self):
        print(self)

a = Prople()
a.eat() # <__main__.Prople object at 0x000001E6DE675610>
print(a) # <__main__.Prople object at 0x000001E6DE675610>

类和实例

当我们调用一个实例的属性时,解析器会先在当前实例中寻找是否有该属性,如果有,则直接返回当前实例的属性值如果没有,则去当前实例的类对象中去寻找,如果有则返回类对象的属性在没有则报错。
类对象和实例中的属性和方法不会因为调用结束而销毁。
如果这个属性或方法是所有实例共享,则应该将其保存在类对象中
如果这个属性或方法是某个实例独有的,则应该保存到实例对象中

__init__(魔术方法)

魔术方法是一种不需要自己调用的特殊方法,它会在特殊的时候自动调用。
在魔术变量中,我们最常用的就是__init__方法,下面我们就来详细介绍一下它的用法。

  1. 此魔术方法会在创建实例后立即执行,用来将内部的内容自动存入到每个实例之中
class Prople:

    def __init__(self):
        self.name = '寻觅'
        print('我的名字是', self.name)

    def can(self):
        print('我很能吃')


data = Prople()
data.can() # 我的名字是 寻    我很能吃
#这里会把self中的内容输出

将属性放入__init__和将属性直接放入class中虽然看似效果相同,但实际两种方法在处理中却截然不同。
如果直接将属性放入类中,属性会变为类中的公共属性,如果修改此公共属性,则公共属性被改变,使用此类创建的实例中此属性也会被改变,而在__init__中的属性则会自动放入每个实例中,及时在某个实例中此属性被修改,也不会影响到其他调用此类创建的实例对象。
我会专门写一篇关于各种魔术方法的介绍和用处,需要的话可以关注我的博客。

属性与方法

类属性

自己在类中定义的属性。可以直接通过类来访问(类.属性),类的实例化对象可以访问类属性,类属性只能通过类对象来修改,无法通过实例对象来修改

class Prople:
    name = '寻觅'
    def eat(self):
        print('%s很能吃' % self.name)
a = Prople()
a.name = '测试'
a.eat()
print(a.name, Prople.name) # 测试 寻觅

实例属性

通过类对象添加的属性。只能通过实例对象来访问和修改,无法使用类对象访问或修改。

实例方法

在类中定义,以self为参数的方法都是实例方法。 => (类.方法(实例) 等价于 实例.方法())

class Prople:
    def __init__(self):
        self.name = '寻觅'
    def can(self):
        print('%s很能吃' % self.name, self)
data = Prople()
data.can() # 寻觅很能吃 <__main__.Prople object at 0x000001A3F6856C40>
Prople.can(data) # 寻觅很能吃 <__main__.Prople object at 0x000001A3F6856C40>

类方法

在类的内部使用@classmethod 来修饰的方法叫做类方法。类方法可以跳过实例,直接通过类进行调用。
(在实例方法中第一个参数为self,而在类方法中第一个参数为cls 。注意: cls和self一样,并不是强制性的命名)
cls是当前类对象

静态方法

在类内部使用@staticmethod来装饰的方法属于静态方法,静态方法不需要指定任何参数,可以通过类和实例去调用。

class Prople(object):
    name = '寻觅'
    @classmethod
    def eat(cls):
        print('%s贼能吃' % cls.name, cls)
    @staticmethod
    def can():
        print('能睡很久')
data = Prople()
data.eat() # 寻觅贼能吃 <class '__main__.Prople'>
Prople.eat() # 寻觅贼能吃 <class '__main__.Prople'>
data.can() # 能睡很久
Prople.can() # 能睡很久
class Animal:

    looks = '各不相同'

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    # 实例方法
    def sleep(self):
        print('%d岁的%s会睡觉' % (self.__age, self.__name))

    # 类方法
    @classmethod
    def eat(cls):
        # 类方法无法调用实例中的属性,魔术方法中的属性在这里就无法使用
        print('动物吃的东西%s' % cls.looks)

    @property
    def name(self):
        return self.__name

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

    # 静态方法,静态方法在类中使用很少,静态方法就相当于把外部的函数放到了类中
    @staticmethod
    def xunmi():
        print('静态方法不用设置self,他不会向自身传递self')


# 类属性
print(Animal.looks)
cat = Animal('猫', 11)
# 修改实例中的类属性
cat.looks = '可爱'
# 类属性没有改变
print(cat.looks, Animal.looks)
# 只能通过类属性来修改类属性
Animal.looks = '多种多样'
print(Animal.looks)

# 实例属性
cat.target = '占领地球'
print(cat.target)
# print(Animal.target)

cat.sleep()
cat.eat()
cat.xunmi()
发布了47 篇原创文章 · 获赞 23 · 访问量 3432

猜你喜欢

转载自blog.csdn.net/qq_39611230/article/details/102693165