定义
class Cat:
def eat(self):
print("%s 吃鱼!" % self.name) #第一参数名建议为self,表示当前对象的引用,类似java中的this
tom = Cat()
tom.name = "Tom" # 临时属性,不建议使用
tom.eat()
初始化方法
class Cat:
def __init__(self):
print("这是一个初始化方法")
self.name = "Tom"
def eat(self):
print("%s 吃鱼!" % self.name)
tom = Cat() # 创建对象时,自动调用初始化方法__init__ 类似java中的构造函数
tom.eat()
实例属性
定义在init方法中的属性为实例属性,即对象属性
class Cat:
def __init__(self,name):
print("这是一个初始化方法")
self.name = name
def eat(self):
print("%s 吃鱼!" % self.name)
tom = Cat("Tom") # 初始化方法 传参
tom.eat()
类属性和类方法
class Dog(object):
count = 0 # 类属性
@classmethod # 类方法 访问类属性时,定义类方法
def run(cls): # 第一个参数为类对象引用
print(cls.count)
@staticmethod # 静态方法 既不访问实例属性,也不访问类属性,就可以定义静态方法
def hello():
print("hhh")
print(Dog.count)
Dog.run()
Dog.hello()
私有属性和方法
属性,或方法 只能在内部访问,以两个下划线开头的为私有属性和方法
class Cat:
def __init__(self):
self.__age = 18
def __hello(self):
print("%s 私有" % self.__age)
tom = Cat()
print(tom.__age) # 报错 __属性,或__方法 只能在内部访问,外部不能访问,注意:__demo__ 不是私有的,后面如果有__就不是私有的
tom.__hello() # 报错,
# 实际上python没有真正意义上的私有属性和方法,python解析器在处理私有属性和方法时,会在属性和方法前
# 前加上 _类名,所有外部访问时,可以通过 _类名__属名性 或 _类名__方法名 访问
print(tom._Cat__age)
tom._Cat__hello()
魔术方法
init
class Cat:
def __init__(self,name):
print("这是一个初始化方法")
self.name = name
def eat(self):
print("%s 吃鱼!" % self.name)
tom = Cat("Tom") # 初始化方法 传参
tom.eat()
del
class Cat:
def __init__(self, name):
print("这是一个初始化方法")
def __del__(self):
print("我去了") # 对象被销毁时,会调用该方法
tom = Cat("Tom")
del tom # 手动销毁对象,
print("-----")
str
和repr类似,如果都定义了,会调用str
class Cat:
def __str__(self): # 类似java中的toString方法
return "我是小猫"
tom = Cat()
print(tom)
setitem
eq
gt
ge
add
int
类型转换:int(p),会调用对象的int方法
内置属性
继承
定义
class Animal(object): # 3.x默认基类为object,而2.x 不是,需要手动写,为了保证兼容性,建议都写(object)
def eat(self):
print("吃")
def run(self):
print("跑")
def sleep(self):
print("sleep")
class Dog(Animal): # 继承父类
def bark(self):
print("狗 叫")
def run(self):
print("狗 跑") # 重写方法
def sleep(self):
# 调用父类的方法 2.x版本使用:Animal.sleep(self),3.x也支持
super().sleep()
print("狗 slepp")
dog = Dog()
dog.eat()
dog.run()
dog.bark()
dog.sleep()