定义一个可口可乐类,类中有一个列表变量。类的变量又称为类的属性。
class CocaCola:
formula = ['caffeine','sugar','water','soda']
类的实例化和属性的使用
coke_for_me= CocaCola()
coke_for_you= CocaCola()
print(CocaCola.formula)
print(coke_for_me.formula)
print(coke_for_you.formula)
>>> ['caffeine','sugar','water','soda']
>>> ['caffeine','sugar','water','soda']
>>> ['caffeine','sugar','water','soda']
for element in coke_for_me.formula:
print(element)
>>> caffeine
>>> sugar
>>> water
>>> soda
创建实例属性(对象属性),及通过实例对象创建和使用类中不存在的属性。
class CocaCola:
formula =['caffeine','sugar','water','soda']'
coke_for_China= CocaCola()
coke_for_China.local_logo = '可口可乐 '
print(coke_for_China.local_logo)
使用实例方法
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def drink(self):
print('Energy!')
coke= CocaCola()
coke.drink()
>>> Energy!
self的解释
coke= CocaCola
coke.drink() == CocaCola.drink(coke)
被实例化的对象会被编译器默默地传入后面方法的括号中,作为第一个参数。self这个参数名称是可以随意修改名称的,但是按照Python的规定,我们统一使用self。
我们还可以加入自己的参数
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def drink(self,how_much):
if how_much== 'asip':
print('Cool~')
elif how_much== 'wholebottle'
print('Headache!')
ice_coke= CocaCola()
ice_coke.drink('asip')
>>> Cool~
魔术方法(如初始化方法 _init_(),创建实例的时候,自动执行的方法 )
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def __init__(self,logo_name):
self.local_logo = logo_name
def drink(self):
print('Energy!')
coke = CocaCola('可口可乐')
coke.local_logo
>>> 可口可乐
类的继承
父类
class CocaCola:
calories = 140
sodium = 45
total_carb = 39
caffeine = 34
ingredients = [
'High Fructose Corn Syrup',
'Carbonated Water',
'Phosphoric Acid',
'Natural Flavors',
'Caramel Color',
'Caffeine'
]
def __init__(self,logo_name):
self.local_logo = logo_name
def drink(self):
print('You got {} cal energy!'.format(self.calories))
子类
class CaffeineFree(CocaCola):
caffeine = 0
ingredients = [
'High Fructose Corn Syrup',
'Carbonated Water',
'Phosphoric Acid',
'Natural Flavors',
'Caramel Color',
]
coke_a= CaffeineFree('Cocacola-FREE')
coke_a.drink()
一些需要注意的地方
- 类属性如果被重新赋值,是否会影响到类属性的引用?
只有实例属性是实例自己的,其他属性来自类。
classTestA:
attr=1
obj_a=TestA()
obj_a.test='test'
TestA.attr=42
print(obj_a.attr)
print(TestA.__dict__)
print(obj_a.__dict__)
>>>42
>>>{'__module__':'第八章.开始使用第三方类库','attr': 42, '__dict__': <attribute '__dict__' of 'TestA' objects>,'__weakref__': <attribute '__weakref__' of 'TestA' objects>, '__doc__':None}
>>>{'test': 'test'}
- 实例属性如果被重新赋值,是否会影响到类属性的引用?
如果改变实例属性的值,那么实例属性的值就来自自身。
classTestA:
attr=1
obj_a=TestA()
obj_b=TestA()
obj_a.attr=42
print(obj_b.attr)
print(TestA.__dict__)
print(obj_a.__dict__)
>>>1
>>>{'__module__':'第八章.开始使用第三方类库','attr': 1, '__dict__': <attribute '__dict__' of 'TestA' objects>,'__weakref__': <attribute '__weakref__' of 'TestA' objects>, '__doc__':None}
>>>{'attr': 42}
- 类属性实例属性具有相同的名称,那么.后面引用的将会是什么?
按照代码执行顺序,最后引用的会是实例属性。
classTestA:
attr=1
def__init__(self):
self.attr=42
obj_a=TestA()
print(TestA.attr)
print(obj_a.attr)
>>>1
>>>42
类的扩展
obj1=1
obj2='String!'
obj3=[]
obj4={}
print(type(obj1),type(obj2),type(obj3),type(obj4))
>>><class 'int'> <class 'str'> <class 'list'><class 'dict'>
安装自己的库
一般需要提交到pip上,简易方法是把python文件放到 site-packages文件夹。
import sys
print(sys.path)
print(sys.path[3])