1.面向过程和面向对象的区别
面向过程 : 需要用什么代码去解决什么问题
面向对象 : 我有什么可以给你什么
2.面向对象的特征
(1)封装
数据不想让别人接触到的
函数(过程) =》 方法(在面向对象中):提供函数、方法对数据进行访问和操作
(2)继承
有一块代码块 A(函数)
B 也想有一个代码块(函数)
(3)多态
一个对象可以体现不同的特征
3. 实验
创建一个类
>>> class Person(object):
... pass
...
创建一个实例对象
>>> kk = Person()
>>> type(kk)
<class '__main__.Person'>
创建实例对象的属性
>>> kk.name = 'kk'
>>> dir(kk)
['__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__'\
, 'name']
定义类的属性
>>> class person(object):
... name = 'kk'
...
>>> kk = person()
>>> kk.name
'kk'
类、实例对象查找属性也是有顺序的:先在实例对象中找,如果实例对象中没,接着去类中属性找,如果类中属性没的话就报错了
小案例: 更好的区分类的属性和实例对象的属性
创建一个类
>>> class Person(object):
... name = 'kk'
...
创建实例对象name1 并给实例对象添加 addr 属性
>>> name1 = Person()
>>> name1.addr = '西安市'
创建实例对象name2 并给实例对象添加 age 属性
>>> name2 = Person()
>>> name2.age = 25
测试访问name1 的age 属性 是报错的 因为 实例对象name1和类中都没有age属性
>>> name1.age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
分别打印类、实例对象name1、实例对象name2的name属性
>>> print(person.name,name1.name,name2.name)
kk kk kk
给实例对象name1重新设置一下name 属性,在依次打印name属性
>>> print(person.name,name1.name,name2.name)
kk kk1 kk
案例总结:
(1)类的属性和实例的属性可以动态赋值
(2)在访问实例对象的属性时,优先访问实例对象的属性;当实例对象的属性不存在的时候,去访问类的属性,类的属性不存在就报错
(3)实例对象设置和修改属性的时候,不会影响类的属性
4.类
初始化函数(构造函数)
以下类中的初始化函数
>>> class person(object):
... def __init__(self):
... self.name = 'kk'
... self.age = 24
...
创建一个实例对象
>>> name1 = person()
>>> name1.name
'kk'
>>> name1.age
24
重新创建一个类
>>> class person(object):
... name = 'Dog'
... def __init__(self):
... self.name = 'dog'
...
分别打印类和实例对象的name属性
>>> name1 = person()
>>> print(name1.name, person.name)
dog Dog
类的方法,如下创建类的方法
>>> class Test(object):
... Name = 'Test'
... @classmethod
... def class_method(cls):
... print(cls.Name)
...
访问类的方法
>>> Test.class_method()
Test
创建实例对象test ,实例对象访问类的方法
>>> test = Test()
>>> test.class_method()
Test
实例的方法
>>> class Test(object):
... Name = 'Test'
... def __init__(self):
... self.name = 'test'
... def instance_method(self):
... print(self.name)
... print(self.Name)
..
访问实例的方法
>>> t = Test()
>>> t.instance_method()
test
Test
静态方法 (@staticmethod)
>>> class Test(object):
... @staticmethod
... def static_method():
... print('static_method')
...
>>> Test.static_method()
static_method
小案例
猫狗大战,猫的初始生命值是120 , 狗的初始生命值是100,random随机掉血,采用继承的方式
#!/usr/bin/python
import random
class Animals(object):
def __init__(self,name,blood=100):
self.name = name
self.blood = blood
def get_name(self):
return self.name
def get_blood(self):
return self.blood
def drop_blood(self,blood):
self.blood -= blood
def attack(self,rival):
drop = random.randint(0,20)
rival.drop_blood(drop)
print(self.name,'让',rival.name,'掉血',drop,'对手剩余:',rival.get_blood(),'血')
class Dog(Animals):
pass
class Cat(Animals):
pass
if __name__ == '__main__':
dog = Dog('wangwang')
cat = Cat('miaomiao',120)
while True:
dog.attack(cat)
if cat.get_blood() < 0:
print('胜利方是:',dog.get_name())
break
cat.attack(dog)
if dog.get_blood() < 0:
print('胜利方是:',cat.get_name())
break
执行结果:
重写父类的***方法,让狗***猫时掉血范围在10-30
class Dog(Animals):
def attack(self,rival):
drop = random.randint(10,30)
rival.drop_blood(drop)
print(self.name,'让',rival.name,'掉血',drop,'对手剩余:',rival.get_blood(),'血')
重写父类的方法,当猫受到的***大于20 的时候自动补血 8
class Cat(Animals):
def drop_blood(self,drop):
super(Cat,self).drop_blood(drop)
if drop > 20 :
print('我掉了',drop,'滴血,触发自动补血技能')
self.blood += 8
5.实例的私有属性
定义一个类
>>> class Person(object):
... def __init__(self,name,age):
... self.__name = name
... self.__age = age
...
创建一个实例,并尝试访问实例的属性,会报错
>>> kk = Person('kk',30)
>>> kk.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'name'
私有属性的访问
>>> kk._Person__age
30
@property 和 @方法名.setter的使用
@property 把一个方法变成属性去调用
@方法名.setter是把一个方法变成属性赋值
>>> class Person(object):
... def __init__(self,name,age):
... self._name = name
... self._age = age
... @property
... def name(self):
... return self._name
... @name.setter
... def name(self,value):
... self._name = value
...
访问测试
>>> kk = Person('kk',20)
>>> kk.name
'kk'
>>> kk.name = 'kk1'
>>> kk.name
'kk1'
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。