python类的学习

0 前言

正如”类”的名称一样,它描述的概念和我们现实生活中的类的概念很相似。生物有不同的种类,食物有不同的种类,人类社会有种种商品也有不同的种类。单反可被称之为一类的物体,他们都有着相似的特征和行为方式。

也就是说:

类是有一些系列有共同特征和行为事物的抽象概念的综合

1 类的属性,实例属性,方法,引用

class CocaCola:
    #在类里面赋值的变量就是类的变量,类的变量有一个专业术语,称之为类的属性
    formula = ["caffeine","sugar","water","soda"]
    #方法就是函数,但我们把这个函数称之为方法。方法是供实例使用的,因此我们还可以称之为实例方法
    #被实例化的对象会被编辑器默默地传入后面的方法括号中,作为第一个参数
    """
    #除了必写的self参数之外,__init__()同样可以有自己的参数,同时不需要这样obj.__init__()方法来调用(因为是自动执行)
    #在实例化的时候往类后面括号中放入参数,相应的所有参数都会传递到这个特殊的__init__()方法中,和函数的参数用法完全相同
    def __init__(self,logo_name):
        #左边的变量作为类的属性,右边是传入的这个参数作为变量,也就是说这个变量的赋值所储存的结果取决于初始化的时候所传进来的参数logo_name,传进来什么那么它就将是什么
        self.local_logo = logo_name
    def drink(self):
        print ("Energy")
coke = CocaCola("可口可乐")
#coke.drink()
coke.local_logo
"""
    #和函数一样,类的方法也能有属于自己的函数,我们先试着在.drink()方法上做些改动
    def drink(self,how_much):
        if how_much == "a sip":
            print("Cool~")
        elif how_much == "whole bottle":
            print ("Headache!")
ice_coke = CocaCola()
ice_coke.drink("a sip")

#类的实例化  按着我们定义好的配方来生产可乐,当然,按照这个配方无论生产多少瓶可乐它们的味道都是一样的
#在左边创建一个变量,右边写上类的名称,看起来很像是赋值的行为,我们称之为类的实例化,而被实例化的对象称之为实例。
coke_for_me = CocaCola()
coke_for_you = CocaCola()

coke_for_China = CocaCola()
#在创建了类之后,通过object.new_attr的形式进行创建一个赋值,于是我们就可以得到一个新的实例的变量,实例的变量称之为实例属性
coke_for_China.local_logo = "可口可乐0" #创建实例属性
print (coke_for_China.local_logo )  #打印实例属性引用结果
#在类的名字后面输入.,IDE就会自动联想出我们之前在定义类的时候写在里面的属性,而这就是类属性的引用
#类的属性会被所有的类的实例共享
print(CocaCola.formula)
print(coke_for_me.formula)
print(coke_for_you.formula)
for element in coke_for_me.formula:
    print(element)



"""
__init__()是initialize(初始化)的缩写,这也就意味着即使我们在创建实例的时候不去引用init_()方法,其中的命令也会先被自动的执行

"""

2 令人困惑的类属性与实例属性

"""
python中属性的引用机制是自外而内的,当创建一个实例之后,准备开始引用属性,这时编辑器会先搜索该实例是否用拥有该属性,有则引用
如果没有,将搜索这个实例所属的类是否有这个尚需经,如果有,则引用,没有就只能报错
"""

#类属性若被重新赋值,会影响到类属性的引用
class TestA:
    attr = 1
obj_a = TestA()

TestA.attr = 42
print(obj_a.attr)
#实例属性若被重新赋值,不会影响到类属性的引用
class TestB:
    attr =1
obj_a = TestA()
obj_b = TestB()

obj_a.attr = 42  #实例属性
print(obj_b.attr)
#类属性实例属性具有相同的名称,那么.后面引用将会发生什么?
class TestC:
    attr = 1
    def __init__(self):
        self.attr = 42
print(obj_b.attr)
print(TestC.__dict__)
print(obj_a.__dict__)

运行结果:

C:\python35\python3.exe G:/untitled/LeiShuxing.py
42
1
1
{'attr': 1, '__dict__': <attribute '__dict__' of 'TestC' objects>, '__init__': <function TestC.__init__ at 0x000001CBBA8DBAE8>, '__module__': '__main__', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'TestC' objects>}
{'attr': 42}

补充

也许运行完上面三段代码,会有一些初步结论,但为更直接的解释,全部隐藏在类的特殊属性dict中。dict是一个类的特殊属性,它是一个字典,用于储存类或者实例的属性。即使你不去定义它,他也会存在每一个类中,是默认隐藏的。

------*** end*** ------