python--动态绑定属性和方法、封装、继承、多态、object类、特殊的属性和方法(下划线开始)

动态绑定属性和方法

class Student: # Student 是类名,由一个或多个单词组成、每个单词的首字母大写 其余小写

    place='北京' #直接写在类里面的变量---------称为类属性

    def __init__(self,name,age):#初始化方法 #这里面的是局部变量
        self.name=name #self.name称为实例属性,进行了一个赋值操作 将局部变量Name的值赋给实例属性
        self.age=age #self.name self.age对象是所有都有的属性

    # 实例方法 self
    def ext(self):  #函数在类之外定义的称为函数、在类之内的称为方法
        print(self.name+'在吃饭.....')



print('------创建对象------')
stu1=Student('王',78)
stu2=Student('后',78)
print(id(stu2))
print(id(stu1))
print('------为stu1动态绑定性别属性------')
stu1.gender='男'  #单独绑定的属性 stu2没有
print(stu1.name,stu1.age,stu1.gender)
print(stu2.name,stu2.age)

print('------类方法------')
stu1.ext()
stu2.ext()
print('------stu1单独绑定类方法------')
def show():
    print('定义在类之外,成为函数')
stu1.show=show

stu1.show()

只针对当前的类型和读一下


面向对象的三大特征(封装、继承、多态)------


class Car: # Car是类对象
    def __init__(self,brand,value):
        self.brand=brand #self.brand实例属性
        self.__value=value #不希望被类的外部使用 所以加了__ 但是可以在类里面被使用
    def start(self):
        print('汽车已经启动')
    def price(self):
        print(self.__value)

car=Car('奔驰',50000000)
car.start() # 使用到了类封装的方法
print(car.brand) # 使用到了类封装的属性
car.price()
# print(car.__value) 类外用不了
#使用方法
print('-------------------')
print(dir(car)) #查看所有属性和方法
print(car._Car__value) #在类的外部可以通过_类名+实例属性


继承 (

具有继承关系 、python支持多继承 可以有多个父类、如果一个类没有继承任何类 默认继承object、定义子类时,必须在其构造函数中调用父类的构造函数

class 子类类名(父类1,父类2)
    pass

#定义Person类
class Person(object): #里面的Object可以不写
    def __init__(self,name,age):#调用__init__方法
        self.name=name
        self.age=age #赋值
    def info(self):
        print(self.name,self.age)


#定义Student类的子类继承Person
class Student(Person):
    def __init__(self,name,age,stu_nu):
        super().__init__(name,age) #使用super去调用父类的方法 传入父类的name age
        self.stu_nu=stu_nu #调用自己的去赋值 学号

class Teacther(Person):
    def __init__(self,name,age,teach_year):
        super().__init__(name,age)
        self.teach_year=teach_year#教龄

#创建学生类的对象
stu=Student('张三',20,'1001')
#创建教师类的对象
teacher=Teacther('李四',50,30)

#调用方法
stu.info()
teacher.info()


可以继承多类

class A(object):
    pass
class B(object):
    pass

class C(A,B):
    pass

方法重写(子类写自己独有的方法--父类中有的子类可以继承--父类提供的方法已经满足不了需求)

# cyy python study
# 开发时间:2022/6/3 11:44

#定义Person类
class Person(object): #里面的Object可以不写
    def __init__(self,name,age):#调用__init__方法
        self.name=name
        self.age=age #赋值
    def info(self):
        print(self.name,self.age)


#定义Student类的子类继承Person
class Student(Person):
    def __init__(self,name,age,stu_nu):
        super().__init__(name,age) #使用super去调用父类的方法 传入父类的name age
        self.stu_nu=stu_nu #调用自己的去赋值 学号
    def info(self): #重写父类方法
        super().info() #执行父类的输出
        print(self.stu_nu)


class Teacther(Person):
    def __init__(self,name,age,teach_year):
        super().__init__(name,age)
        self.teach_year=teach_year#教龄

    def info(self):
        super().info()
        print(self.teach_year)

#创建学生类的对象
stu=Student('张三',20,'1001')
#创建教师类的对象
teacher=Teacther('李四',50,30)

#调用方法
stu.info()
print('--------------')
teacher.info()







object类(是所有类的父类) 

使用内置函数dir查看属性和方法

__str__这个方法用于返回一个对象的描述

class Stuednt:
    def __init__(self,name,age): #这个方法是object继承的方法
        self.name=name
        self.age=age


#创建对象
stu=Stuednt('张三',20)

print(dir(stu)) #是从父类继承的

print(stu) #输出对象的描述 默认调用__str__方法


重写str方法 

class Stuednt:
    def __init__(self,name,age): #这个方法是object继承的方法
        self.name=name
        self.age=age
    #重写父类的方法
    def __str__(self):
        return '我的名字是{0},今年{1}岁'.format(self.name,self.age)

#创建对象
stu=Stuednt('张三',20)

print(dir(stu)) #是从父类继承的

print(stu) #输出对象的描述 默认调用__str__方法


多态(具体多种形态---不知变量的类型) 

静态语言实现多态的三个条件:(JAVA)

        继承、方法重写、父类引用指向子类对象

动态语言(python):与是否继承无关,只需要查看是否有方法

class Animal(object):
    def eat(self):
        print('动物会吃')
class Dog(Animal):
    def eat(self):
        print('狗吃骨头')
class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Person(object):
    def eat(self):
        print('人吃五谷杂粮')

#定义一个函数
def fun(obj):
    obj.eat()


#调用函数
fun(Cat()) #重写了父类的方法会重写
fun(Dog())
fun(Animal())
print('-------------------------')
fun(Person()) #与上面的没有继承关系  只关心有没有eat方法


特殊的属性和方法

print(dir(object))


__dict__获得类对象或实例对象所绑定的所有属性和方法的字典

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age = age
#创建c类对象
x=C('Jack',38)
print(x.__dict__) #实例对象的属性的字典
print(C.__dict__) #类对象  查看到了属性和方法
print('---------------------')
print(x.__class__) # 输出对象所属的类
print(C.__bases__) #输出的是父类元组
print(C.__base__) #class C(A,B): 由于该位置A离得近
print(C.__mro__)#查看类的层次结构 类的继承关系
print(A.__subclasses__())#查看子类 子类的列表


add

a=20
b=100
c=a+b #两个整数类型的对象的相加的操作
d=a.__add__(b)
print(c)
print(d)

class Student:
    def __init__(self,name):
        self.name=name

    def __add__(self, other):
        return self.name+other.name
#创建对象
stu1=Student('张三')
stu2=Student('李四')

s=stu1+stu2 #实现两个对象的加法运算(在Student中编写了特殊的__add__方法)
print(s)
s1=stu1.__add__(stu2)
print(s1)


 len

lst=[20,30,520,52]
print(len(lst)) #len是内置函数 可以计算列表的长度
print(lst.__len__())#如果需要输出对象的长度 就需要编写len的内置函数

class A:
    def __init__(self,name):
        self.name=name
    def __len__(self):
        return len(self.name)
stu1=A('Jack')#4个字符
stu2=A('李四')
print(len(stu1))
print(len(stu2))


创建对象 new ()先进行

初始化init后进行

class A(object):
    def __init__(self,name,age):#对对象的属性进行初始化使用
        print('__init__被调用执行了,self的id值为:{0}'.format(id(self)))
        self.name=name
        self.age=age

    def __new__(cls, *args, **kwargs): #用来创建对象
        print('__new__被调用执行了,cls的id值为:{0}'.format(id(cls)))
        obj=super().__new__(cls) #调用父类的new方法
        print('创建的对象id为:{0}'.format(id(obj)))
        return obj


print('object这个类的id:{0}'.format(id(object)))
print('A这个类的id:{0}'.format(id(A)))

#A类的实例对象为
p1= A('张三',20)
print('p1这个A类的实例对象id:{0}'.format(id(p1)))

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值