类
class Person:
name='swk'#全局赋值
pass
class Myclass:
pass#pass表示此处可以写很多代码,简称:资源占位符
print(type(Myclass))#<class 'type'>
print(Myclass)#<class '__main__,Myclass'>
mc1=person()
mc2=person()
mc3=person()
print(mc1)
print(mc2)
print(mc3)
#python的对象具有内存地址存储数据的唯一性
result1=isinstance(mc1,Person)
result2=isinstance(mc2,Person)
result3=isinstance(mc3,Person)
print(result1)
print(result2)
print(result3)
#mc*都是person的实例,他们都是一类对象--也是'一个类'的实例化操作
#isinstance()用来检查一个人对象是否是一个类的实例,和Java中this关键字功能一样
this关键字表示’区分’当前对象–不一样的内存管理机制
print(id(Person))#通过id方法查看对象的内存地址
print(type(Person))#值?<class’type’>–类类型
对象的初始化
- 什么是对象的初始化
- 就是给对象的方法,属性等赋值的方法
class Person:
def say_hello(self):#name可以不用定义
print('hello%s'%self.name)
pass
p1=Person()
p1.say_hello()#通过对象调用方法
print()#打印输出
p2=Person()
p2.name='swk'
p2.name='zjl'```
p2.say_hello()
print()
#此处name属性和name一样this.name=name
#以上赋值称为动态赋值
class Person:
def __init__(self,name):
# 通过self向新建的对象中初始化属性
#操作对象的核心代码(封装,继承,多态)
self.name = name
def say_hello(self):
print('大家好,我是%s'%self.name)
在Python语言当中通过方法调用对象的 属性值 和
class Dog():
def __init__(self,name):
self.name=name
d=dog()#不带参的构造器
d=Dog('狗')#对象
d.name='小黑'#调用方法
print(d.name)
#一个完整的对象操作实例
class Dog2():
def __init__(self,name):
#init方法很浪费内存
#自定义一个隐藏属性
self.hidden_name=name#hiddenname是name的别名称
#self.name=name
def get_name(self):#get方法必须有返回值
return self.hidden_name
def __set_name__(self,name):#set方法至少带有两个参数
self.hidden_name=name#set方法里面必须判断对象名称
def say_hello(self):
print('大家好,我是%s'%self.hidden_name)
d2=Dog2('大黄')
d2.say_hello()
print(d2.get_name())
print(d2.get_name(),id(Dog2))
d2.__set_name__('旺财')
print(d2.get_name())
#self.hiddenname=name等价于Java的私有化成员你变量,属性,方法private
set方法可以自定义
1. 调用底层写法: def set_name(self,owner,name):
尽量使用自定义方法,自定义的Python不进入底层执行,效率高
get方法可以自定义
1. Python里面底层不封装get方法,因为get方法是一个程序员可以自定义的普通方法/普通函数,但是程序员也去底层自己定义封装一个代码块,再去调用
- init会在对象创建之后离开执行
- init可以用来向新创建的对象中初始化属性
- 调用类创建对象是,类后面的所有参数都会依次传递到init()中
class Dog2():
def __init__(self,name,age):
self.hidden_name=name#hiddenname是name的别名称
self.hidden_age=age
def get_name(self):#get方法必须有返回值
return self.hidden_name
def __set_name__(self,name):#set方法至少带有两个参数
self.hidden_name=name#set方法里面必须判断对象名称
def set_age(self,age):
#set里面可以进行一系列的计算判断,循环条件的操作
self.hidden_age=age
def get_age(self):
return self.hidden_age
def say_hello(self):
print('大家好,我是%s'%self.hidden_name)
d2=Dog2('大黄')
d2.say_hello()
print(d2.get_name())
print(d2.get_name(),id(Dog2))
d2.__set_name__('旺财')
print(d2.get_name())
print(d2.get_age)
问: 在Python中类或者对象的封装性如何体现?
答: 给对象的属性定义别名
#计算举行面积
class Rectangle:
def __init__(self,height,width):
self.hidden_height=height
self.hidden_width=width
def get_height(self):
return self.hidden_height
def get_width(self):
return self.hidden_width
def set_height(self,height):
self.hidden_height=height
def set_width(self,width):
self.hidden_width=width
def get_area(self):
return self.hidden_height*self.hidden_width
r=Rectangle(5,4)
r.set_height(7)
r.set_width(8)
print(r.get_area())
两个下划线的作用原理:
- 是一个通配符,在Python里面是独一无二的
- 可以表示一个思想(万物皆为对象)
- 可以用来获取对象的所有属性的值
使用__开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用一般我们会将一些私有属性(不希望被外部访问的属性)以_开头
一般情况下,使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性
print(p.Person)
property装饰器,用来将一个get方法,转换为对象的属性
添加为property装饰器以后,我们就可以像调用属性一样使用get方法
使用property装饰的方法,必须和属性名是一样的
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
# property装饰器,用来将一个get方法,转换为对象的属性
# 添加为property装饰器以后,我们就可以像调用属性一样使用get方法
# 使用property装饰的方法,必须和属性名是一样的
@property
def name(self):
print('get方法执行了~~~')
return self._name
# setter方法的装饰器:@属性名.setter
@name.setter
def name(self, name):
print('setter方法调用了')
self._name = name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
p = Person('猪八戒', 18)
p.name = '孙悟空'
p.age = 28
print(p.name, p.age)
‘’’
3.用户:创建一个名为UserUser的类,其中包含属性first_name和last_name,
还有用户简介通常会存储的其他几个属性。在类User中定义一个名为
describe_user()的方法,它打印用户信息摘要;
再定义一个名为greet_user()的方法,它向用户发出个性化的问候。
创建多个表示不同用户的实例,并对每个实例都调用上述两个方法.
‘’’
class User():
def __init__(self,first_name,last_name,age,sex,phone,login_attempts=0):
self.first_name=first_name
self.last_name=last_name
self.age=age
self.sex=sex
self.phone=phone
self.login_attempts=login_attempts
def describe_user(self):
print('大家好我叫%s %s,我今年%d岁,我的电话是%s'%(self.first_name,self.last_name,self.age,self.phone))
def greet_user(self):
print('尊敬的%s,恭喜你中了五百万。'%self.first_name)
def increment_login_attemptss(self):
self.login_attempts += 1
print('当前登录次数%d'%self.login_attempts)
def reset_login_attempts(self):
self.login_attempts = 0
print('当前登录次数%d' % self.login_attempts)
if __name__ == '__main__':
joe = User('joe','black',19,'男','18600009999')
joe.describe_user()
joe.greet_user()
joe.increment_login_attempts()
joe.increment_login_attempts()
joe.increment_login_attempts()
joe.reset_login_attempts()