欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习第八天

程序员文章站 2022-07-10 08:24:01
...

类与对象

对象 = 属性 +方法
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:代表一个实例对象的名称

基本的魔法方法

  1. init(self[, …]) 构造器,当一个实例被创建的时候调用的初始化方法
  2. new(cls[, …]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__
  3. str(self):当你打印一个对象的时候,触发__str__,str强转数据类型的时候,触发__str__,当你使用%s格式化的时候,触发__str__
  4. repr(self):有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__,当你使用%r格式化的时候 触发__repr__
  5. add(self, other)定义加法的行为:+
  6. sub(self, other)定义减法的行为:-
  7. mul(self, other)定义乘法的行为:*
  8. truediv(self, other)定义真除法的行为:/
  9. floordiv(self, other)定义整数除法的行为://
  10. mod(self, other) 定义取模算法的行为:%
  11. divmod(self, other)定义当被 divmod() 调用时的行为
  12. divmod(a, b)把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)

迭代器

迭代器是一个可以记住遍历的位置的对象,从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退,字符串,列表或元组对象都可用于创建迭代器。

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行,调用一个生成器函数,返回的是一个迭代器对象

相关标签: python