python学习第八天
类与对象
对象 = 属性 +方法
python中用class来定义类,后面紧跟类名,以及";",例:
class People: #定义类时,首字母需要大写
'''这是一个普普通通的类'''
#定义属性
Name = 'Xiaoming'
Age = 18
Hight = 172
Weight = 65
#定义方法
def run(self):
print("小明正在跑")
return "小明正在跑"
def fly(self):
print("小明正在飞")
a = People()
print(a,type(a)) #<__main__.People object at 0x00000284313B0828> <class '__main__.People'>
print(a.run()) #小明正在跑,调用People类中的run函数
print(a.fly()) #None,调用People类中的fly函数,但是运行PeoPle中在调用时打印出"小明正在飞",但是,没有返回值,于是print(a.fly()) 输出为None
类的多态指的是不同对象对同一方法响应不同的行动,例:
class People:
def run(self):
print("people is run")
class Cat:
def run(self):
print("Cat is run")
class Dog:
def run(self):
print("Dog is run")
#对于不同的类都存在run方法,这时候需要调用Cat类中的run方法
#需要重新定义一个函数
def fun(a):
a.run()
#将整个函数指向需要执行的类
fun(Cat()) #Cat is run
类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self。在调用方法时,我们无需明确提供与参数 self 相对应的参数,例:
class People:
def SetName(self,name):
self.name = name
def Say(self):
print("My name is {0}".format(self.name))
a = People()
a.SetName("Xiaoming")
a.Say() # My name is Xiaoming
在类中,__init__方法在实例化的时候会自动调用,无需人工调用,例:
class People:
def __init__(self,name):
self.name = name
def Say(self):
print("My name is {0}".format(self.name))
a = People("Xiaoming")
a.Say() # My name is Xiaoming
与上面例子不同的是,下面例子中使用__init__方法,无需调用,直接对类赋值即可,而上面使用自定义的方法,则要对方法进行赋值。
在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。
私有变量和公有变量的定义
- name:公有变量
- _name:公有变量或方法,不能通过import导入其他模块(只有模块内部使用)。类对象和子类可以访问
- __name:私有变量或方法(伪私有),类外部不能直接访问,内部可以访问
- name:公有变量或方法,子类可以访问。魔法方法或属性(例如:init),不推荐这样命名
- name_:公有变量或方法。一般为了避免和python关键字冲突,不推荐这样命名
例:
class People:
def __init__(self,name,age):
self.name= name
self.__age = age
def setname(self):
print("my name is {0}".format(self.name))
def __age(self):
print("my age is {0}".format(self.__age))
def xiaoming(self):
self.setname()
self.__age()
a = People('xiaoming',18)
a.setname() # my name is xiaoming
a.__age() # 'People' object has no attribute '__age'
a.xiaoming() # my name is xiaoming,'int' object is not callable
类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个,语法为:
class A(object):
pass
魔法方法
-
魔法方法总是被双下划线包围,例如__init__
-
魔法方法的第一个参数应为cls(类方法) 或者self(实例方法)
cls:代表一个类的名称 self:代表一个实例对象的名称
基本的魔法方法
- init(self[, …]) 构造器,当一个实例被创建的时候调用的初始化方法
- new(cls[, …]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__
- str(self):当你打印一个对象的时候,触发__str__,str强转数据类型的时候,触发__str__,当你使用%s格式化的时候,触发__str__
- repr(self):有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__,当你使用%r格式化的时候 触发__repr__
- add(self, other)定义加法的行为:+
- sub(self, other)定义减法的行为:-
- mul(self, other)定义乘法的行为:*
- truediv(self, other)定义真除法的行为:/
- floordiv(self, other)定义整数除法的行为://
- mod(self, other) 定义取模算法的行为:%
- divmod(self, other)定义当被 divmod() 调用时的行为
- divmod(a, b)把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
迭代器
迭代器是一个可以记住遍历的位置的对象,从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退,字符串,列表或元组对象都可用于创建迭代器。
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行,调用一个生成器函数,返回的是一个迭代器对象
上一篇: 如何快速构建Spring-Boot项目
下一篇: python的os 模块 --第八讲